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!