pwnhub 9月公開賽
作者:jambolt 編輯:白帽子社區運營團隊
"白帽子社區在線CTF靶場BMZCTF,歡迎各位在這里練習、學習,BMZCTF全身心為網絡安全賽手提供優質學習環境,鏈接(http://www.bmzclub.cn/)
"
利用技巧
- fastbin attack
- tcachebin attack
- IO_file
- FSOP 利用 pwntools SigreturnFrame模塊
程序分析
程序保護情況
沙盒保護

禁止程序執行系統命令,且限定使用 ARCH_x86_64指令
程序保護
程序保護全開

libc環境
glibc-2.31
程序漏洞出現點
free調用可以越界

leave_num 的最大值可以取為8,固free 最大次數為9

全局變量 break_up_list與 chunk_list想連,發生free越界時,會執行free(break_up_list[8])既free(chunk_list[0]),可以用于構造double free。
利用過程
1)通過largebin泄露libc基址和堆空間地址
堆空間的地址泄露 在unsortedbin中申請 largebin 大小的chunk是,滿足 bck=fwd時會觸發執行堆塊的 fd_nextsize和bk_nextsize 寫入 堆塊的地址


泄露libc地址

申請堆塊后的堆空間 寫入 'a' * 8 覆蓋堆塊fd 可以進行libc泄露,寫入 'a'*16覆蓋 fd和bk 可以泄露堆空間地址

2)構造fastbins attack
題目中可以對 break_up_list進行越界free,先將tachebins 填滿

之后再通過越界free(chunk_list[0])來構造double free,既
free(break_up_list[6])free(break_up_list[7])free(chunk_list[0]) #越界free

成功控制fastbins鏈表

3)通過fastbin attack 構造tcache bin attack
申請 兩個 0x450的 堆塊 top_chunk被擠到 0x290 + (0x460 * 2) = 0xb50,申請一個0x20的chunk_list[15] 定位到了 0xb50

從unsortedbin中申請0x20堆塊 內容寫上偽造的chunk_size

之后申請的smallbin也會從unsortedbin中申請
清空之前的tcachebins,剩下之前構造的double free

再次申請堆塊,fastbins 進入 tcachebins,改寫fd指針,控制tcachebins,tcache之后申請的空間可以改寫 chunk_list[0]

之后free chunk_list[0], chunk_list[1],使之進入 tcachebins[0x260]中,再次申請0x40的堆塊可以改寫 tachebins[0x260]的鏈表


之后改寫_IO_2_1_stdin_
4)FSOP執行觸發流程
exit() -> __run_exit_handlers() -> IO_cleanup() -> _IO_flush_all_lockp()-> _IO_str_overflow() -> malloc() -> __malloc_hook-> setcontext -> mprotect()



通過setcontext 和 mprotect 跳轉到之后寫入的匯編代碼進行執行

在got表的匯編代碼中實現了 fd = open("flag.txt", 0)

read(fd, buf, 0x40)

write(fd, buf, 0x40)
