linux 下缓冲区溢出攻击原理及示例

本文探讨了通过修改eip寄存器实现的缓冲区溢出攻击原理,并以具体实例展示了如何利用这种技术执行任意代码。同时介绍了如何绕过现代操作系统如Red Hat中的堆栈保护机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、溢出目标

     无论是在windows下还是在linux下,溢出攻击基本上都是以控制计算机的执行路径为目标,而x86下执行哪条指令是由eip寄存器来控制的,所以如果能够修改eip寄存器的值,就可以修改计算机的执行路径。

    所以溢出的目标:控制eip寄存器。

二、关于call/ret

      但是如何修改eip寄存器呢?在汇编指令中有一个和eip寄存器紧密相关的指令ret,ret就可以理解为pop eip。而ret指令在正常函数调用的时候都会执行的。

      我们来看下linux中函数调用的例子:

      下面是objdump –d 得到的 汇编指令。

      我们用图来解释一下在函数调用时都发生了什么。

绘图1

      下面是几个有用的结论:

      1、当被调用函数开始执行时堆栈由高地址到低地址依次是:被调用函数的参数(参数n,参数n-1……,参数0),eip的原始值,ebp的原始值,被调用函数自己的局部变量。这些东东不一定是连续存储的。

      2、被调用函数的局部变量的地址我们是可以知道的,保存eip原始值的位置就在局部变量的不远处。

      3、当被调用函数返回时,由ret指令恢复现场,把堆栈中的eip的原始值交还给eip。

      那么,我们只要找到堆栈中eip原始值的存储位置,把他改成shellcode的地址就OK了。

三、一个例子

      这个例子是当main函数(也是被别的函数调用的,只不过名字比较特殊)返回时,我们把eip改掉,让他来执行/bin/ls。这段代码在arch linux是可以执行的。

 

四、关于堆栈保护

         但是上面的代码在redhat下面运行就会报段错误。因为redhat使用了堆栈保护技术,就是数据段的数据尤其是堆栈段的数据是不能被执行。

         我们可以执行首先执行 sudo echo 0 | tee /proc/sys/kernel/exec-shield。

         再运行上面的那个例子,不出意外的话应该溢出成功了:在redhat下堆栈保护的开关是由/proc/sys/kernel/exec-shield这个文件控制的。

         在实际攻击时,还有其他巧妙的方法绕过Linux不可执行堆栈保护。

 

 

http://blog.youkuaiyun.com/sealyao/archive/2010/11/07/5993938.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值