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是因為只寫乙個的話數太大,要打很多空格,會很慢。
溢位完成。
某次比賽的總結 。。。丟人就不說是啥了
之前要去比賽的時候真的是一點信心沒有。然後各種不安,覺得自己的知識量太小,而且對學過的很多演算法掌握的也不是太熟練,比如數論跟計算幾何我連模板都懶得整理了。比賽之前主要是看的各種模板,做了很多自己原來做的一些比較經典的題,也做了一些沒做過的。然後揹著各種模板就坐上火車走了。一路上仨人各種 各種憧憬。...