LYS Rop lab_srop Writeup
lab_srop
這次藉著到 AIS3 當助教的緣故順便跟 Curious 一起把 LYS ROP 系列課程的 lab 整理到了部落格,也方便給學員參考。
Srop
首先這次的 lab 跟前面會有比較大的差異,必須要來先介紹一下 srop 是什麼東東。
那 srop 的全名是 Sigreturn Oriented Programming,這個攻擊手法來自於 kernel 在做信號處理的時候,會把之前的狀態保存在 user mode 可以讀寫的地址中,所以當我們去調整 signal frame 為特定值的時候,這時候呼叫 rt_sigreturn 的系統調用就會開 shell。那 signal frame 的結構如下(截圖自 lys 簡報):
Exploitation
那這次的程式超級超級簡單,不用看少什麼 rop gadget 了,我們什麼都沒有 w,如下:
1 | └─$ objdump -M intel -d srop |
這個程式跑起來會去執行 read(0, rsp, 0x400)
,也就是從 stdin 讀 0x400 到 rsp 上。
Find RSP
要算 rsp 最直接的方式就是直接跑起來進去 debug 看 stack 上的狀態然後找到適合的算一下差值就可以,需要注意的是有些差值是不固定的,所以可以多跑幾次確認,然後本地環境也需要盡量接近遠端,那這邊因為只是 lab 就偷懶只做本地了 XDD
Build Signal Frame
照 lys 的簡報乖乖填好:'/bin/sh\x00'
的位置可以透過直接 print(len(payload)) 來算出來
Call rt_sigreturn
要呼叫 r2_sigreturn 的話我們可以查詢 syscall.sh ,會發現這次要把 rax 填成 15,也就是要跟剛開始的手法一樣,輸入 15 個 bytes 控 rax,但因為輸入的東西會從 rsp 開始,所以我們要覆蓋一樣的東西上去,才不會打亂我們剛剛構造的 signal frame,那 read 的時候因為已經吃掉 8 個 bytes 也就是 0x401000 所以我們會輸入 p2[8:][:15]
,來確保 payload 不變,輸入後踩上 syscall 也就是 0x40100e 就會 call r2_sigreturn
搭配我們構造好的 signal frame 就會 call execve('/bin/sh\x00', 0, 0)
Exploit
1 | import time |
Result
1 | └─$ python exploit.py |
Pwned !!!
- Title: LYS Rop lab_srop Writeup
- Author: kazma
- Created at : 2024-08-05 23:57:48
- Updated at : 2024-08-06 13:33:03
- Link: https://kazma.tw/2024/08/05/LYS-Rop-lab-srop-Writeup/
- License: This work is licensed under CC BY-NC-SA 4.0.