---
# System prepended metadata

title: HW6

---

# 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)





