-
-
[原创]栈迁移
-
发表于:
2020-3-7 11:05
11506
-
看到了一道栈迁移的题,就来写一下加深印象
未开启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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-3-7 11:06
被plkk编辑
,原因: