LYS Rop lab_rop2 Writeup
lab_rop2
這次藉著到 AIS3 當助教的緣故順便跟 Curious 一起把 LYS ROP 系列課程的 lab 整理到了部落格,也方便給學員參考。
那因為是一系列的 lab,所以接下來只會主要講跟上個版本的差異
Stack Migration
首先提一下 stack migration 的概念:
當我們今天發現程式可以 overflow 但是溢出的長度卻不夠我們構造 ROP 開 shell 的時候,我們可以透過塞入一個 leave; ret
gadget,控制 rbp 進而跳到另外一個足夠的空間詠唱。
以下附上 LYS 的投影片截圖參考:
Diff
首先附上部分程式碼:
1 | printf("What is your name? "); |
那這次跟 rop1 的主要差別是第二個輸入點的溢出長度只有 0x10,所以沒辦法跟上一個 lab 一樣把 rop chain 寫到 buf 裡,那這裡就可以用我們上面提到的 stack migration。
Exploitation
我們可以透過先往 name 寫入 /bin/sh\x00
還有我們的 rop chain,然後再從 buf 填入 name 的地址和 leave; ret
來讓 rip 跳到 rop chain 上,成功 RCE。
Exploit
1 | from pwn import * |
Dive in
那剛好這幾天在 AIS3 當助教有很多學員都問到同一個問題,這邊提出來討論:
Q: 為什麼 migration 不是跳到 name + 8 的位置,執行 /bin/sh\x00
不會報錯嗎?
A: 問的好,首先如果我們不確定 exploit 執行過程中到底 binary 發生什麼事的話,gdb 是我們的好朋友。
那打開 gdb 後我們首先來看一下 payload 放進去的樣子:
看起來很完美,那繼續執行下去很去就會發現兩次的 leave; ret
會把 rbp 填成 /bin/sh\x00
:
所以這樣剛好 rip 就會從 rop chain 的開頭開始執行。
Result
最後依照慣例附上 exploit 的結果:
1 | └─$ python exploit.py |
Pwned !!!
- Title: LYS Rop lab_rop2 Writeup
- Author: kazma
- Created at : 2024-08-01 09:24:27
- Updated at : 2024-08-03 17:06:13
- Link: https://kazma.tw/2024/08/01/LYS-Rop-lab-rop2-Writeup/
- License: This work is licensed under CC BY-NC-SA 4.0.