# HW7 ## heapmath ### 解題&觀察 這次的題目一進去介面如下,這題考點是想測試解題者對於tacche、fastbin、small bin等等的bin其架構跟header是否了解 ![](https://i.imgur.com/VWbalFv.png) 由於nc edu-ctf.zoolab.org 10006進入的介面是有Timeout時間限制的 所以我解題是透過寫Python來解 總共分五大題 : 1. tcache chall : 回答Tcache的0x30、0x40的subbin內有哪些chunk、 此題只須求個別的chunk size即可得出結果,chunk size = malloc size - 0x8 + 0x10 ![](https://i.imgur.com/iQQlTTC.png) 2. address chall : 此題會給出一個chunk的address,讓我們求另一個chunk的address,其解法舉例來說,假設求D的chunk address = C的chunk address + C的chunk size ![](https://i.imgur.com/eTsllg9.png) 3. index chall : 此題會給出Y的某個element = 0xdeadbeef,讓我們求X第幾個element可以是0xdeadbeef,解題方式就是去計算&X[0]到Y[6]有多少Bytes,再將Bytes整除8即可求出 以下圖為例,由於X資料內容 + Y chunk header = 0x50 Bytes = 80 Bytes (10進位),且Y[0~5]共6*8 = 48 Bytes,offset共128 Bytes, 128/8 = 16,故回答16 ![](https://i.imgur.com/64M4twJ.png) 4. tcache fd chall : 這題可以透過下圖簡報來求,題目會給出Y chunk address,讓我求Y chunk fd,求法為Y chunk address - chunk size ,以下題為例,0x55b51c043f0 - 0x50 = 0x55b51c0e43a0 ![](https://i.imgur.com/SqXR1Km.png) ![](https://i.imgur.com/MRZASN7.png) 5. fastbin fd chall : 此題為最後一題,此題與上題類似,差別只在Fastbin的fd指向header,Tcache指向data,算法為Y chunk address - chunk size - 0x10 header size ,以下圖為例,0x55b51c0e43f0 - 0x50 - 0x10 = 0x55b51c0e4390 ![](https://i.imgur.com/fbypzu9.png) 最後可以得到FALG!! ![](https://i.imgur.com/5mYZXbx.png) ## babynote ### 觀察&解題 此題是一題選單題,其解法講師都有寫在簡報中,而我理解其題目後再將Code寫出而已,我程式所做的行為如下,可以對映pwn2簡報124~129頁: 1. 堆結構,堆出A、B、C三個結構 ![](https://i.imgur.com/UQjPyXX.png) 2. leak from unsorted bin,可以leak到main_arena的address ![](https://i.imgur.com/lAfwUME.png) 3. 構造fake chunk,並利用overflow蓋寫object的"data" member ![](https://i.imgur.com/KiTGGQH.png) 4. 最後 Get shell ![](https://i.imgur.com/3keCEnB.png) 但由於我的程式最後的delete好像會被吃掉,所以沒辦法直接獲取shell,需要在執行程式之後在做一次delete就可以拿到shell ![](https://i.imgur.com/4SZDOoU.png) 最後就可以把FLAG讀出!! ![](https://i.imgur.com/qPNdqVm.png) ## babyums ### 觀察&解題 此題跟babynote相似,不同之處在於其struct內容多了一個password,並且有兩個FLAG 解題流程一樣是4步 1. 堆結構,堆出A、B、C三個結構 ![](https://i.imgur.com/CuWnVWQ.png) 2. leak from unsorted bin,可以leak到main_arena的address ![](https://i.imgur.com/6fZmm4x.png) 3. 構造fake chunk,並利用overflow蓋寫object的"data" member ![](https://i.imgur.com/cJSd5wW.png) 4. 最後 Get shell ![](https://i.imgur.com/KfWfuyZ.png) 因為與LAB其struct不同,所以需要注意下面幾點: 1. add user時需要多send密碼 ![](https://i.imgur.com/K64wsIl.png) 2. fake_chunk需要增加密碼的部分 ![](https://i.imgur.com/AWIQ4Re.png) 3. 在sendline(data + fake_chunk)前要送出size,因為struct增加了password,所以送出的size從LAB的0x38變成0x48 最後執行起來直接cat /home/chal/flag即可獲取到FLAG2 ![](https://i.imgur.com/OHO4Rku.png) 想要獲取FLAG1直接cat /home/chal/babyums.c就好 ![](https://i.imgur.com/BquZv2w.png) 但這裡需要注意,我直接將這個FLAG上傳會失敗,之後cat /home/chal/chal去看程式的binary,看到FLAG需要小寫 ![](https://i.imgur.com/RyXJuY7.png) 所以FLAG1為flag{C8763}!!