堆栈溢出
Posted pyqb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆栈溢出相关的知识,希望对你有一定的参考价值。
这是一个简单的会溢出的程序
![](https://image.cha138.com/20210609/471d60c9f5b94d92adfe829bba47cc70.jpg)
run时返现程序程序终止,并得到以下提示栈溢出而奔溃。eip的值并没有被改变。
![](https://image.cha138.com/20210609/a6087ae506484f23aa208995eb89add7.jpg)
查看寄存器的内容,发现eip的值并没有发生改变,这是因为gcc默认开启堆栈保护,当检测到有栈溢出时就会自动终止。
![](https://image.cha138.com/20210609/c49f4dbc0a3e4f3cad8615ae1fbfc11b.jpg)
如果我们希望修改eip时不退出调试,比如编写shellcode时,我们需要关闭gcc的堆栈保护
gcc -fno-stack-protector overflow.c -o overflow
gdb overflow
run
这里提示试图执行0x41414141的错误指令而奔溃,而不是提示因为栈溢出而奔溃,eip的值被改变了,但是0x41414141是一个错误的机器指令所以执行它时会报错。
![](https://image.cha138.com/20210609/9642fcb6300a42f083ccd2118b3a2985.jpg)
这时发现eip的值被改成了0x41414141
![](https://image.cha138.com/20210609/049d7376b59544bb87a54a4ab567d80d.jpg)
sysctl -w kernel.randomize=0关闭ubuntu地址随机化
修改堆栈溢出程序
![](https://image.cha138.com/20210609/0f3cb9ce816b4a63996ae9c368713bbb.jpg)
gcc -mpreferred-stack-boundary=2 -fno-stack-protector -g meet.c -o meet
-fno-stack-protector关闭gcc堆栈保护
./meet Mr `perl -e \'print "A" x 400\'`
./meet Mr `perl -e \'print "A" x 600\'`
![](https://image.cha138.com/20210609/060efd093d8a4a68a3c54e3639d31724.jpg)
栈溢出
gdb meet
list
![](https://image.cha138.com/20210609/76d1b7535a364030b5f0397e6c8a187e.jpg)
b 6
![](https://image.cha138.com/20210609/e026eb521a7540f59ceb54a261e6154d.jpg)
当拷贝的值大小没超过name的范围时
run Mr `perl -e \'print "A" x 400\'`
![](https://image.cha138.com/20210609/912a422e523241f3899e5919549d7d2b.jpg)
当拷贝的值大小超过name的范围时
run Mr `perl -e \'print "A" x 600\'`
![](https://image.cha138.com/20210609/3ffea75e52d349f6aea45e36a110804f.jpg)
可以看到函数的参数已经被破坏
两个指针都指向0x41414141,而相应的值是NULL,而print()无法处理NULL,所以就会出现段错误
长度从400增加到408
run Mr `perl -e \'print "A" x 404\'`
刚好改变了ebp,但没有改变eip
![](https://image.cha138.com/20210609/753f5b577f924e629f571d686d34cb3b.jpg)
run Mr `perl -e \'print "A" x 408\'`
![](https://image.cha138.com/20210609/cf512f16d9434c99b999d6e623d7097f.jpg)
刚好改变了eip的值
![](https://image.cha138.com/20210609/4ac64bb4790c4aed88f32cde85be3ba9.jpg)
这里的数字400~408并不重要,重要的时逐渐增加字符串的长度,直至缓冲区溢出刚好改写了栈中的eip值,而不涉及更多的变动,因为在缓冲区溢出之后,紧接着就是printf调用。
以上是关于堆栈溢出的主要内容,如果未能解决你的问题,请参考以下文章