對某次比賽裡PWN的分析

2021-07-11 03:26:12 字數 1455 閱讀 1078

md5: fc76a2efbd7d07a89a2dd343b9328e26

sha1: edaa95db7406e5076a2aa8b30ba6b3e7547cd7b4

crc32: 1374f4f7

很久很久之前某次ctf的pwn。。。題目在附件。

首先分析.exe檔案

前面可以看到程式建立了socket服務

黃色選中的call為『程式功能區』

進入call後,程式先問候一下使用者,並設ebx為0:

然後等待使用者輸入:

清場:在輸入的字串中查詢\x0d,\x0a這兩個字元。【這兩個查詢的目的我不確定,,留作日後任務:

檢測輸入字串前九位是否與」username 」相同,如果不同,跳轉至loc_45212c9(即為檢測輸入字串是否是」login 」函式處):

清場:檢查字串長度,如果字串長度超過0x7f,只取前0x7f位:

按格式輸出乙個字串。需要注意的是此處【mov     dword_4532a6c, 1(此處即為我們需要覆蓋的關鍵記憶體點)】:

接下來是檢測輸入是否以」login 」開頭的函式,緊挨著這一函式的是校驗輸入是否以」getflag」開頭的函式。(因服務端並未向客戶端請求資料,所以此處將校驗失敗,並在最後返回到本個call最開始的部分等待使用者輸入):

上圖中可以看到,輸入」login password」後,【mov     dword_4532a6c, 2】,將關鍵位置設定為2。

並且有:

cmp    byte_4532a70, bl   //4532a70是我們

jnz    short loc_4521306

即如果沒有輸入」username 」,則將報錯。

如果均為正確輸入,則有

call   sub_4521000

在結束這些操作後,檢驗4532a6c處的值,如果其值為0x4452534e,則send    flag.txt裡的內容。

跟進4521000,先清場,然後檢驗字元長度,如果超過0x100,則報錯:

用幾個api生成ip位址的字串表示,並壓入棧

計算長度,將字串send出去:

然後在下面,出現了乙個格式化字串漏洞:

靜態分析結束,拖進od

直接進入關鍵點,配置輸入,服務端輸出如下:

棧內如下:

還可以看到棧內下面不遠處就是我們的username

構造一下輸入:

「username a\x6c\x2a\x53\x04***x\x6e\x2a\x53\x04」

//此處目測是出了一點問題,應該是從』2』開始位元組對齊的。所以字串前只加乙個』a』

「login%x%x%x%x%x%x%x%x%x%x%x%x%x%x%21169x%n%61700x%n」

其中第一段%x用於為%n找到寫在username裡的位址,之所以使用兩個%n是因為只寫乙個的話數太大,要打很多空格,會很慢。

溢位完成。

某次比賽的總結 。。。丟人就不說是啥了

之前要去比賽的時候真的是一點信心沒有。然後各種不安,覺得自己的知識量太小,而且對學過的很多演算法掌握的也不是太熟練,比如數論跟計算幾何我連模板都懶得整理了。比賽之前主要是看的各種模板,做了很多自己原來做的一些比較經典的題,也做了一些沒做過的。然後揹著各種模板就坐上火車走了。一路上仨人各種 各種憧憬。...