###### 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 了。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up