Simple Reverse - 0x19(2023 Lab - WinMalware - Extract Next Stage Payload)
Description
取出 eductf-lab.exe 中的 next stage payload (embedded PE file),並計算其 MD5 hash。 Flag format: FLAG{462fe0000…} (hex character must be lowercase)
Background
- DOS Header
- NT Headers - Optional Header
Source code
- sub_140001870
:::spoiler IDA Source Code解析前
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22__int64 __fastcall sub_140001870(char **pe_file, _QWORD *pe_file_size) { *pe_file = byte_140005040; *pe_file_size = 72770i64; // 這是個是怎麼判斷成PE size我也不知道 if ( **pe_file == 'ZM' ) { if ( *(sub_1400013D0(*pe_file) + 0x18) == 0x20B ) { return 1i64; } else { sub_140001260("remote dll optional header magic check failed\n"); return 0i64; } } else { sub_140001260("remote dll magic check failed\n"); return 0i64; } }:::
Recon
- 進到
sub_140001BF0之後可以先觀察sub_140001870,前面有source code可以看到他正在比對byte_140005040的前面兩個字元是不是等於MZ,也就是一支PE file的magic header,並且又比對了後面0x18的位置是不是等於0x20B,也就是另外一個magic header(用來判斷該程式是否可於64-bits運行),由以上操作幾乎可以確定駭客把真正的程式(可能是惡意的)塞在正常的PE file中 :::info 如果只是要解題的話,到這邊就可以了,只要利用前一題學到的把byte_140005040改變他的type,變成char[72770],再用Shift+E,把raw data export出來,丟到online md5 checksum,就可以得到這支檔案的hash(462fe0007f86957f59824e113f78947c)
::: -
sub_1400013D0仔細看他的操作,其實就是把byte_140005040的地址,加上0x3C,再取值,就是e_lfanew,也就是NT Headers的file offset,這個offset加上原本的原本的140005040就是NT header,所以可以把sub_1400013D0rename成getNtHdr1
2
3
4__int64 __fastcall getNtHdr(__int64 a1) { return *(a1 + 0x3C) + a1; } - 接下來可以改變這個function的type,按Y,
改IMAGE_NT_HEADERS *__fastcall getNtHdr(_QWORD),就變得非常簡潔好看,另外,要把pe_file的type從_int64改成_QWORD的原因是pe_file存的是byte_140005040的地址,不是數字,雖然代表的byte數一樣,但意義不相同,所以IDA可能會解析不出來
- 最後就把目前的這個sub function rename成
getEmbeddedPE_File就可以了
:::info
:::
:::spoiler 解析後
1 |
|
:::
Flag: FLAG{462fe0007f86957f59824e113f78947c}