码迷,mamicode.com
首页 > 系统相关 > 详细

Linux下缓冲区溢出攻击及Shellcode

时间:2015-05-07 18:59:56      阅读:367      评论:0      收藏:0      [点我收藏+]

标签:linux   shellcode   

4.3.2 Linux32环境下函数的返回地址

编译、链接、执行程序buffer_overflow.c,并关闭Linux的栈保护机制,参见截图:

技术分享

下面用gdb调试程序:

在foo函数的入口、调用strcpy函数处和foo返回处设置断点:

 技术分享

继续运行,找到函数的返回地址:

技术分享

 

buff的起始地址B到保存函数的返回地址A之间的偏移:

A-B=0xbffff29c-0xbffff280=0x1c=16+12=28

因此,如果Lbuffer的长度超过28字节,将会发生缓冲区溢出,Lbuffer中偏移28的4个字节“ABCD”将覆盖地址为0xbffff29c内存单元的值,即foo的返回地址变为“ABCD”(0x44434241)。

技术分享

由于0x44434241不可访问,因此出现断错误。

 

4.3.3 Linux32环境下的Shellcode编写

编译、链接、执行shell_asm_fix_opcode.c,可以通过缓冲区溢出获得shell,参见下图:

技术分享

4.4做实验并写实验报告

没有修改文件前:

技术分享

 

为了找出发生溢出的原因,用gdb调试:

由于lvictim没有发生溢出,所以为了调试方便,我把老师的源代码buffer[512]改成了buffer[500],如图:

技术分享

重新编译运行,发生段错误:

技术分享

下面开始用gdb调试,找出smash_largebuf函数的返回地址所在的内存单元与缓冲区起始地址的距离。

先反编译smash_largebuf函数:

技术分享

技术分享

然后设置三个断点:

技术分享

下面启动进程,得到函数的返回地址0xbffff35c:

技术分享

继续执行到下一个断点,buff的开始地址在0xbffff158,存放在0xbfffed30中:

技术分享

所以:

0xbffff35c-0xbffff158=0x204=516

OFF_SET=516

BUFFER_ADDRESS有一个范围,可以从0xbffff158开始设置

程序中需要改动的地方如下:

技术分享

下面开始演示攻击lvictim,并获得shell,要注意关闭地址随机化:

技术分享

可以看到,已经获得了shell,实验成功了。

 

 

Linux下缓冲区溢出攻击及Shellcode

标签:linux   shellcode   

原文地址:http://blog.csdn.net/xumesang/article/details/45562921

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