先用file来查看文件类型,发现是32位的文件
然后拉近ida分析
点进vuln函数里面,找到一个read函数
双击buf后发现内存单位只有0x6c+4=112<0x100,说明发生溢出。
再去gdb里面调试一下。
首先,查看保护机制,发现没有保护。
然后计算一下偏移。
由此可得偏移量为112.
我们在文件里面查找system函数发现没有找到,查找‘/bin/sh’也显示没有
说明这一次我们需要先找到system函数然后再利用read函数,将bin/sh写入bss地址里面,将bss这个地址作为system,再调用system函数,拿到shell
那么,我们如何找到system函数呢
可以通过libc文件泄露出system函数和binsh的地址 ,一般通过write()函数泄露 ,在本次的题目里面刚好就有write函数,通过ELF获得write函数的地址,同时获得程序start地址,构造payload
payload 一般是填充字符(栈的大小)+ ‘aaaa’(覆盖EBP)+ p32(write_plt) + p32(start)(返回地址main_addr) + p32(1)+ p32(要泄露的地址)+p32(4)
DynELF是pwntools中专门用来应对无libc情况的漏洞利用模块,其基本代码框架如下:
p = process('./xxx')
def leak(address):
#各种预处理
payload = "xxxxxxxx"+ address + "xxxxxxxx"
p.send(payload)
#各种处理
data = p.recv(4)
log.debug("%#x => %s" % (address, (data or '').encode('hex')))
return data
d = DynELF(leak, elf=ELF("./xxx")) #初始化DynELF模块 systemAddress = d.lookup('system', 'libc') #在libc文件中搜索system函数的地址
查看bss的地址
exp 如下:
结果如下: