Ret2libc

昨晚同学问了关于ret2libc时参数布置的问题,今天在此记录
假设熟悉stack overflow
Ps:ret2libc是为了对抗DEP/NX产生

栈的布置

在说明ret2libc之前,栈的布置需要提前说明一下,以以下简单代码为例

#include <stdio.h>

int trap(int x)
{
    int y=0;
    y+=x;
    return y;
}

int main(int argc,char **argv)
{   
    int z=5;
    trap(5);
    return 0;
}

在执行trap(5)之后的栈布局就像是这样

ebp

注意5是在ebp+8这个位置的。

为了对抗DEP/NX,覆盖后的ret-addr必须是可以执行的内存位置,所以引入了ret2libc。

在libc.so中,有一个system()函数,如果我们能把ret-addr覆盖到这里就好了,system需要一个参数,常见的有”/bin/bash”,这个参数又该放在哪里?

假如我们现在成功的覆盖为system,考虑现在的esp和ebp位置
9

当下一步pop eip执行之后,我们就会进入到system()
而system()内执行的是

push ebp
mov ebp,esp
...

所以,ebp会指向上方的over flow,所以,在str-addr就是我们要放置”/bin/bash”的地方啦~(ebp+8)

而下方的overflow我们会放置exit()的地址,因为system()执行完毕后,下一个pop eip的就是这里了

既然都说到了ret2libc,那么ROP也不远啦~有空再来说说ROP

详细ret2libc资料,请参考此pdf

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值