首页
社区
课程
招聘
[原创]栈迁移
发表于: 2020-3-7 11:05 11505

[原创]栈迁移

2020-3-7 11:05
11505

看到了一道栈迁移的题,就来写一下加深印象

未开启NX,且栈溢出大小较小,无法直接泄露libc_base

以32位为例,在使用call这个命令,进入一个函数的时候,程序会进行一系列栈操作:
push eip+4;push ebp;mov ebp,esp;来保护现场,避免执行完函数后堆栈不平衡以及找不到之前的入口地址。
leave ret相当于:

其中pop eip相当于将栈顶数据给eip,由于ret返回的是栈顶数据,而栈顶地址是由esp的值决定的,esp的值,从leave可以得出是由ebp决定的。所以我们可以通过覆盖ebp的值来控制ret返回地址。两次leave ret即可控制esp为我们想要的地址。由于有pop ebp,会使esp-4,将ebp 覆盖为想要调整的位置-4即可

[Black Watch入群题]spwn

这个题有一个便捷的就是s就是在bss段

这里试验泄露puts不行,问了出题人,他说是因为puts很吃栈,导致stack跑到不可写区段了。

easyR0p

与上题的溢出是一样的,但是这个题没有直接写入bss的变量,64位使用寄存器传参

我们在ida中可以找到调用read的片段。数据x偏移 + ebp + ret可以溢出覆盖ebp的值,达到read到bss的效果。

可以使用system("/bin/sh")或者one_gadget


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-3-7 11:06 被plkk编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
谢谢分享,很有用
2020-4-1 22:59
0
游客
登录 | 注册 方可回帖
返回
//