码迷,mamicode.com
首页 > 其他好文 > 详细

堆栈溢出

时间:2017-04-24 12:20:24      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:png   protect   处理   指针   print   技术分享   1.5   log   image   

这是一个简单的会溢出的程序
技术分享
run时返现程序程序终止,并得到以下提示栈溢出而奔溃。eip的值并没有被改变。
技术分享
查看寄存器的内容,发现eip的值并没有发生改变,这是因为gcc默认开启堆栈保护,当检测到有栈溢出时就会自动终止。
技术分享
如果我们希望修改eip时不退出调试,比如编写shellcode时,我们需要关闭gcc的堆栈保护
gcc -fno-stack-protector overflow.c -o overflow
gdb overflow
run
这里提示试图执行0x41414141的错误指令而奔溃,而不是提示因为栈溢出而奔溃,eip的值被改变了,但是0x41414141是一个错误的机器指令所以执行它时会报错。
技术分享
这时发现eip的值被改成了0x41414141
技术分享
sysctl -w kernel.randomize=0关闭ubuntu地址随机化
修改堆栈溢出程序
技术分享

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‘`
技术分享
栈溢出
gdb meet
list
技术分享
b 6
技术分享
 
当拷贝的值大小没超过name的范围时
run Mr `perl -e ‘print "A" x 400‘`
技术分享
当拷贝的值大小超过name的范围时
run Mr `perl -e ‘print "A" x 600‘`
 技术分享
可以看到函数的参数已经被破坏
两个指针都指向0x41414141,而相应的值是NULL,而print()无法处理NULL,所以就会出现段错误
 
长度从400增加到408
run Mr `perl -e ‘print "A" x 404‘`
刚好改变了ebp,但没有改变eip
技术分享
run Mr `perl -e ‘print "A" x 408‘`
技术分享

刚好改变了eip的值

技术分享

这里的数字400~408并不重要,重要的时逐渐增加字符串的长度,直至缓冲区溢出刚好改写了栈中的eip值,而不涉及更多的变动,因为在缓冲区溢出之后,紧接着就是printf调用。

堆栈溢出

标签:png   protect   处理   指针   print   技术分享   1.5   log   image   

原文地址:http://www.cnblogs.com/zylq-blog/p/6755668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!