---
# System prepended metadata

title: HW7

---

# 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}!!



