看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路

Editor發表於2018-12-23

看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


2018年12月1日,『看雪CTF.TSRC 2018 團隊賽』之攻擊篇正式開啟!比賽一開始,雨落星沉隊便拿下一血,其餘團隊緊跟其上。時間不相上下,甚至有些隊伍之間只有十幾秒之差。


接下來我們一起來看看本次比賽的最新進展吧! 


最新賽況戰況一覽 


CTF第一題《初世紀》由 防守方 Elvina之隊出題,截止比賽結束已被89個團隊攻破。 

看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


本題過後,攻擊團隊率先領先的Top10團隊為: 

看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


千里之行始於足下,第一題只是一個開始,前面還有14道題,等待大家去探索。 Welcome to join our journey! 前十名是否會有新的面孔出現?讓我們拭目以待!


 第一題 解題思路 


下列解析文章由 DickBoomSky 原創 

看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


0x00 分析工具

x64dbg

IDA 7.0

Stud_PE


0x01 解題過程

這道題是64位的程式,而且開啟了重定位。開啟地址隨機化的程式在除錯過程中配合IDA查詢對應的函式地址會很麻煩,所以我用stdu_pe這個工具先修改PE檔案的Option Header中的Dll Characteristics,把這個的資料置為0,然後載入到偵錯程式中之後就首地址就會和IDA中一樣。

看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


然後將程式載入到x64dbg中執行,然後再check按鈕上設定訊息斷點。

看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


在輸入框中隨意輸入一些資料後,點選check按鈕。程式會斷在ntdll中,這時用快捷鍵alt+m(和OD中一樣)。然後在初世紀.exe的TEXT段設定斷點(F2)。

看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


然後讓程式繼續執行就會自動斷在程式判斷序列號的位置了,這個函式的首地址就是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

轉載請註明:轉自看雪學院



合作伙伴

看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


騰訊安全應急響應中心 


TSRC,騰訊安全的先頭兵,肩負騰訊公司安全漏洞、黑客入侵的發現和處理工作。這是個沒有硝煙的戰場,我們與兩萬多名安全專家並肩而行,捍衛全球億萬使用者的資訊、財產安全。一直以來,我們懷揣感恩之心,努力構建開放的TSRC交流平臺,回饋安全社群。未來,我們將繼續攜手安全行業精英,探索網際網路安全新方向,建設網際網路生態安全,共鑄“網際網路+”新時代。

看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路


轉載請註明:轉自看雪學院




看雪CTF.TSRC 2018 團隊賽 解題思路彙總: 












相關文章