# HW6 ## Got2win ### 觀察&解題 這題大致的內容助教已經在影片中講解,主要就是透過程式碼中read(1,...,...)的漏洞來將read@got的內容改成write的plt位址 ![](https://i.imgur.com/yiU5RMx.png) 以下為GDB執行時的GOT Table ![](https://i.imgur.com/hNwbEih.png) 可以看的到不同函數的got跟plt位址 ![](https://i.imgur.com/5MeLn36.png) 透過助教的Code,將read的plt位址改成write的plt位址 ![](https://i.imgur.com/hppfXLS.png) 最後就可以順利獲得FLAG!! ## rop2win 由於這題LAB解題重點已經在影片中講解 Code大致內容與課堂上所說的差不多 只需要做以下步驟即可 1. 透過IDA找出fn跟ROP位址 ![](https://i.imgur.com/pvNQh6B.png) ![](https://i.imgur.com/fI9GN66.png) 2. 找出chal程式中所有的ROPgadget,此txt檔將附在作業中 ![](https://i.imgur.com/Du01DxJ.png) 3. 撰寫POC,其中需要注意點是:由於pop_rdx_ret找到ROPgadget如下 0x0000000000493a2b : pop rdx ; pop rbx ; ret 所以需要在pop_rdx_ret, 0x30後面多一個任意數字,我在這邊添加0 ![](https://i.imgur.com/IY0WpVQ.png) 4. 如此,即可獲得FLAG!! FLAG{banana_72b302bf297a228a75730123efef7c41} ![](https://i.imgur.com/LEnI3XH.png) ## rop++ ### 觀察&解題 此次Code存在明顯buffer overflow ![](https://i.imgur.com/z7fsGtm.png) 而我解題的思路就是透過覆蓋return成我們想要的指令 簡單說就是我想要在return address上構造ROPchain 取得程式ROPchain的指令如下 ROPgadget --binary ./chal --ropchain 如此即可獲得下圖的ROPchain ![](https://i.imgur.com/nogVWTm.png) 透過這些ROPchain,我們可以寫出下面程式 其中p在一開始會有40個A的offset,是因為我透過dbg看到buf會開0x20的空間 而蓋掉rbp需要0x8,所以要覆蓋到return address共需要0x28也就是40個garbage ![](https://i.imgur.com/xSPJlDG.png) 最後在Linux中執行此程式即可獲得FLAG!! FLAG{chocolate_c378985d629e99a4e86213db0cd5e70d} ![](https://i.imgur.com/hnZJFRh.png)