---
# System prepended metadata

title: HW 0x06 Write Up
tags: [Course, CS, NCTU, SecureProgramming]

---

###### tags: `NCTU` `CS` `Course` `SecureProgramming`

HW 0x06 Write Up
==
yysung

## [Lab 6-1] Fastnote

程式有三個行為可以執行，new 可以獲得一個小於 120 bytes 的 heap 空間並將記憶體位址存於 note 陣列，delete 可以 free 掉 note 陣列裡的位址，但不會清空 note 陣列裡的值，print 可以將 note 陣列裡的位址指向的值以字串形式印出。

因為 free 後不會刪除記憶體位址，所以可以對已 free 過空間再次執行 free。

fastbin 的 free 並不會將下一個 chunk 的 prev in use 改成 0，只會檢查該次 free 的記憶體位址和 fastbin stack 的 top 是否相同，所以可以用

```
free(A)
free(B)
free(A)
```

達成 double free，再次 new 出相同大小的 chunk 時就可以寫入記憶體位址，達成 fastbin dup attack，讓之後 new 的記憶體空間位於之前指定的位址。

首先 fastbin dup attack 到 `0x601ff5` 來 leak libc 位址

再來 fastbin dup attack 到 `__malloc_hook - 0x28 + 0x5` 來寫入 `one_gadget` 到 `__malloc_hook`

接下來再執行 free 就可以觸發 `__malloc_hook`，就可以拿到 shell 了。

## [Lab 6-2] Smallnote

使用 unsafe unlink

`fake = 0x602040`

先 new 出兩個 0x108 的 heap 空間，再將第一個 chunk edit 成已被釋放掉(將第二個 chunk 的 prev in use 設為0)，還有將 fd 和 bk 改為 `fake - 0x18` 和 `fake - 0x10` 再將第二個 chunk free 掉，就可以將 `fake` 改成 `&fake - 0x18`。

接下來使用 edit(0) 就可以修改 `fake` 附近的空間了。

先將`fake` 附近的空間填滿 'a' 到 libc 的位址，就可以 leak libc 的位址了。

再來可以用 edit(0) 將 `fake` 本身改成 `__free_hook` 的位址，再用 edit(0) 把 `__free_hook` 改成 system，之後再執行 free 就會呼叫 `__free_hook`，就會將 chunk 的內容放入 system 執行，所以先在第三個 chunk 中填入 `/bin/sh` 再執行 delete(2) 就可以拿到 shell 了。

## [HW 0x06] Wtfnote

程式有三個行為可以執行，new 可以獲得一個小於等於 88  bytes 的 heap 空間並將記憶體位址存於 note 陣列，delete 可以 free 掉 note 陣列裡的位址，並且會清空 note 陣列裡的值，print 可以將 note 陣列裡的位址指向的值以字串形式印出。

因為 print 不檢查輸入範圍，所以可以印出 note 陣列以外的值當作記憶體位址的字串。在 stack 尋找後，找到一個指向內容是 stack 位址的位址，所以可以得到 note 陣列的位址。

fastbin chunk 在 free 後，會將 fd 寫入原本存 chunk data 的地方，再次 new 出相同大小的 chunk，並且 `new(0, "")` 時不會改動原本 heap 裡的值，所以可以得到 heap 的位址。

unsorted chunk 在 free 後，會將 `libc_base + 0x3c3b78` 放在 FD 和 BK，可以使用 print 的漏洞，`print('-25'+ '\x00' * 6 + 位址)` 可以指定 heap 上的 FD 來印出 libc 的位址。

接下來可以做出 0x60 大小 chunk 的 fastbin dup attack，delete 也有漏洞，`delete('-25'+ '\x00' * 6 + 位址)` 可以指定位址刪除，就可以 note 陣列裡的位址被刪除後還可以再次刪除該位址。

再來在 new_note 的 read_int 中放入 `0x0 0x60` 作為 fastbin dup attack 跳到 stack 的 chunk，接下來就可以在 read 時將 read 的 return address 蓋成 one_gadget，並且注意 one_gadget 的限制條件，將 note+7 的值設為 0，就可以拿到 shell 了。
