pwn之栈迁移
两道典型的栈迁移
ciscn_2019_es_2
漏洞处:
1  | int vul()  | 
显然需要泄漏ebp的位置,然后栈迁移,然后ROP
printf的格式化字符串漏洞,可以泄漏ebp的位置,通过末尾非\x00来泄漏ebp的位置
1  | pay1='a'*0x20+'b'*8  | 
由于32位,故取4字节
关键是构造第二次的payload,不过我们有system的地址,所以可以直接ROP
1  | pl2=(b'a'*8+p32(ebp-0x24)+#'cccc'address  | 
实质上是将s高地址部分充分利用
首先看p32(ebp-0x2c)部分:目的是将ebp恢复至'bbbb'的地址,之后程序返回到main,并继续恢复栈帧,此时返回地址即为system的地址,故system('/bin/sh')即可
至于ebp的偏移量,则是动态调试得出结果
完整exp
whoami
题目:
1  | __int64 __fastcall main(__int64 a1, char **a2, char **a3)  | 
其中unk_601040为未初始化全局变量,在bss段,它就是目标栈
咱首先得在buf处铺垫好
1  | payload1 = b'A'*0x20  | 
Line3的目的是在main返回后返回到unk_601040处
然后没有system,需要泄漏libc,然后ROP
完整exp
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xiong's blog!






