2018年12月1日,『看雪CTF.TSRC 2018 團隊賽』之攻擊篇正式開啟!比賽一開始,雨落星沉隊便拿下一血,其餘團隊緊跟其上。時間不相上下,甚至有些隊伍之間只有十幾秒之差。
接下來我們一起來看看本次比賽的最新進展吧!
最新賽況戰況一覽
CTF第一題《初世紀》由 防守方 Elvina之隊出題,截止比賽結束已被89個團隊攻破。
本題過後,攻擊團隊率先領先的Top10團隊為:
千里之行始於足下,第一題只是一個開始,前面還有14道題,等待大家去探索。 Welcome to join our journey! 前十名是否會有新的面孔出現?讓我們拭目以待!
第一題 解題思路
下列解析文章由 DickBoomSky 原創
0x00 分析工具
x64dbg
IDA 7.0
Stud_PE
0x01 解題過程
這道題是64位的程式,而且開啟了重定位。開啟地址隨機化的程式在除錯過程中配合IDA查詢對應的函式地址會很麻煩,所以我用stdu_pe這個工具先修改PE檔案的Option Header中的Dll Characteristics,把這個的資料置為0,然後載入到偵錯程式中之後就首地址就會和IDA中一樣。
然後將程式載入到x64dbg中執行,然後再check按鈕上設定訊息斷點。
在輸入框中隨意輸入一些資料後,點選check按鈕。程式會斷在ntdll中,這時用快捷鍵alt+m(和OD中一樣)。然後在初世紀.exe的TEXT段設定斷點(F2)。
然後讓程式繼續執行就會自動斷在程式判斷序列號的位置了,這個函式的首地址就是0x0000000140001340。然後再IDA中跳轉到這個位置以後,使用F5快捷鍵檢視程式的偽C程式碼。
INT_PTR __fastcall checkserino(HWND a1, int a2, unsigned __int16 a3)
{
int v3; // ebx
unsigned __int16 v4; // si
HWND v5; // rdi
int v6; // ebx
int v7; // ebx
UINT v9; // ebx
CHAR *v10; // rdx
HICON v11; // rax
HWND v12; // rax
CHAR String2[16]; // [rsp+30h] [rbp-D0h]
int v14; // [rsp+40h] [rbp-C0h]
__int16 v15; // [rsp+44h] [rbp-BCh]
char v16; // [rsp+46h] [rbp-BAh]
__int64 v17; // [rsp+48h] [rbp-B8h]
int v18; // [rsp+50h] [rbp-B0h]
__int16 v19; // [rsp+54h] [rbp-ACh]
char v20; // [rsp+56h] [rbp-AAh]
CHAR Dst; // [rsp+60h] [rbp-A0h]
char v22; // [rsp+61h] [rbp-9Fh]
char v23; // [rsp+62h] [rbp-9Eh]
char v24; // [rsp+63h] [rbp-9Dh]
char v25; // [rsp+64h] [rbp-9Ch]
char v26; // [rsp+65h] [rbp-9Bh]
CHAR String; // [rsp+D0h] [rbp-30h]
v3 = a2;
v4 = a3;
v5 = a1;
memset(&String, 0, 80ui64);
memset(&Dst, 0, 100ui64);
v18 = 2797193651;
v19 = 0xA1A3u;
v20 = 0;
v14 = 0xCEB4BBD2;
v17 = 0xA1A3E3C4B2CFA7B9i64;
v15 = 0xA1A3u;
v16 = 0;
*(_OWORD *)String2 = xmmword_1400453C0;
v6 = v3 - 16;
if ( !v6 )
{
DestroyWindow(v5);
return 0i64;
}
v7 = v6 - 256;
if ( !v7 )
{
v11 = LoadIconA(hInstance, (LPCSTR)0x70);
SendMessageA(v5, 0x80u, 1ui64, (LPARAM)v11);
SendDlgItemMessageA(v5, 1000, 0xC5u, 0x50ui64, 0i64);
v12 = GetDlgItem(v5, 1000);
SetFocus(v12);
return 0i64;
}
if ( v7 != 1 )
return 0i64;
if ( v4 == 1002 )
{
SendMessageA(v5, 0x10u, 0i64, 0i64);
return 1i64;
}
if ( v4 != 1013 )
{
if ( v4 == 1014 || v4 == 40002 )
{
DialogBoxParamA(hInstance, (LPCSTR)0x67, v5, (DLGPROC)DialogFunc, 0i64);
return 1i64;
}
return 1i64;
}
v9 = GetDlgItemTextA(v5, 1000, &String, 81);
GetDlgItemTextA(v5, 1000, &Dst, 101);
if ( v9 != 6 || Dst != '6' || v22 != 'E' || v23 != 'w' || v24 != 'i' || v25 != '9' || v26 != 'H' )
v10 = String2;
else
v10 = (CHAR *)&v17;
lstrcpyA((LPSTR)&String1, v10);
DialogBoxParamA(hInstance, (LPCSTR)0x79, v5, (DLGPROC)sub_1400012E0, 0i64);
return 1i64;
}
在這段程式的最後我們可以看到v9 = GetDlgItemTextA(v5, 1000, &String, 81);,這裡就是程式獲取輸入內容的位置,v9儲存的是輸入序列號的長度。在下邊有一個if判斷(if ( v9 != 6 || Dst != '6' || v22 != 'E' || v23 != 'w' || v24 != 'i' || v25 != '9' || v26 != 'H' ))。這裡首先判斷序列號的長度是否為6,然後又判斷了序列號的從第一位開始的每一位是否正確。在這裡我們就能拼湊出正確的序列號6Ewi9H。
最後只需要提交FLAG即可。
原文作者:DickBoomSky
原文連結:https://bbs.pediy.com/thread-248100.htm
轉載請註明:轉自看雪學院
合作伙伴
騰訊安全應急響應中心
TSRC,騰訊安全的先頭兵,肩負騰訊公司安全漏洞、駭客入侵的發現和處理工作。這是個沒有硝煙的戰場,我們與兩萬多名安全專家並肩而行,捍衛全球億萬使用者的資訊、財產安全。一直以來,我們懷揣感恩之心,努力構建開放的TSRC交流平臺,回饋安全社群。未來,我們將繼續攜手安全行業精英,探索網際網路安全新方向,建設網際網路生態安全,共鑄“網際網路+”新時代。
轉載請註明:轉自看雪學院
看雪CTF.TSRC 2018 團隊賽 解題思路彙總: