備戰OSCP——緩衝區溢出實戰(一)

如題所示,爲了備戰OSCP的緩衝區溢出,特開新篇。

本系列所有的例子均可以在git上找到,鏈接爲:https://github.com/freddiebarrsmith/Buffer-Overflow-Exploit-Development-Practice

本次所用的是第一個例子,brainpan.exe.沒記錯的話應該是出自vulnbox。

首先第一步,驗證程序,使用od打開brainpan.exe,使用自帶的brainpan.py進行測試

發現程序存在溢出情況。隨機我們需要確認可以對該程序造成溢出的字符量爲多少,這裏將會用到msf自帶的一個腳本,路徑爲

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb

利用這個腳本的-l參數可以自定義生成不同長度的不同字符,這裏選用600來進行測試:

將這串生成的字符寫入我們的腳本並進行運用:

程序如約崩潰,打開OD查看此時的EIP值爲35724134:

然後繼續用msf自帶的腳本:

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb

運用-q參數加上eip值確定造成溢出的字節數爲524,修改我們的腳本進行運用:

其中'\x41'*524爲使程序崩潰的確切數值

'\x42'*4是覆蓋ESP的值

'\x43'*(600-524-4)是我們可以用shellcode填充的值

接下來我們需要找到我們可以利用的ESP的值,才能讓程序順利的執行我們的shellcode:

在OD使用ctrl+f,找到我們JMP ESP命令的內存地址:

然後用該地址替換我們腳本中的填充位'\x42'*4,然後在JMP ESP上下斷點(F2),如果腳本執行成功的話,程序是會在我們斷點處停止:

如圖所示,將ESP地址填充後,運行我們的腳本,程序在我們的ESP斷點處停止:

生成shellcode之前,我們需要對badchar進行檢查:

badchars = ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
"\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
"\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
"\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")

我們可以根據途中EIP的點來大概定位字節位置,然後ctrl+G跳轉到該位置,用我們的填充'\x90'和oscptest來判斷我們badchcar check的結果,0-9,A-F中間要是有一個缺少了,那就是badchar,我們在生成shell的時候就要對其進行規避,用-b參數,比如-b "\0x00\0x72\0xca"等,oscp據說考試的時候會有幾個badchar,這要仔細檢查。

0x00肯定是有問題的,在生成的時候直接排除

接下來我們可以用msf生成一串shellcode,然後編寫我們的exploit:

這邊出去20個字符的'\x90'是爲了跟前邊的部分區分開,保證我們的shellcode不被幹擾。

接着我們在msf上開一個監聽:

然後運行我們的exploit,可以看到有session彈回來:

這邊有一點一定要注意,之前我們在測試JMP ESP的時候有下過一個斷點,要記得取消,不然一直無法回彈shell。

第一章就到這裏,感謝各位

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章