AngelBoy Windows Binary Exploitation Winmagic Writeup

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

Intro

Hi, 我是 Kazma~
這堂課是臺灣好厲駭 AngelBoy 的 Windows Binary Exploitation 系列課程,由於今年只有錄影檔而且沒有 lab 可以使用,所以自己試著把講師上課的 lab 還原並整理解題筆記在這邊,感謝 AngelBoy 的課程!
喔對了因為錄影檔很小聲所以我有把影片上傳到下面這個網站,然後把音量調超大,推薦大家可以用看看:
https://online-video-cutter.com/tw/volume

Lab Recover

source code:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//g++ -g -o Winmagic.exe .\Winmagic.cpp -fpermissive
#include <iostream>
#include <io.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <cstdint>

void get_flag2() {
const char key[] = "Do_you_know_why_my_teammate_Orange_is_so_angry?";
char cipher[] = {
'\x02', '#', '\x1e', '>', '\x14', '"', '6', '\x05', '\n', '\r',
'\x10', '\x00', '\x1e', '\x1b', '&', 'k', '\x01', '\n', '0', '+',
'\x13', '\x04', '\x1f', '\x14', '>', '\x1c', '\x00', '3', '?', '4',
'\x14', '\x02', '8', '#', '0', '\x1b', ',', '-', '@', '\x19',
'l', '\x13', '\x1d', '\x0e', '\x1c', '\x1e', 'B'
};

for (size_t i = 0; i < sizeof(cipher); i++) {
printf("%c", cipher[i] ^ key[i]);
}
getchar();
}

void get_flag3() {
const char key[] = "Do_you_know_why_my_teammate_jeffxx_is_so_angry??????????";
char cipher[] = {
'\x02', '#', '\x1e', '>', '\x14', '6', '0', '\x05', '\n', '\x06',
'\x03', 'n', '\x18', '\x06', '&', '=', '\x1f', '\x1c', '>', '\x1f',
'\x15', 'Q', '\x04', '\x03', '\x15', '\x07', ':', 'k', '\x18', 'V',
'9', '\x05', '\x17', '\x16', ')', '\x0c', '\x1d', '6', '\x16', '\x01',
'+', '>', '\x07', '\t', '-', '\x0b', 'Z', '^', 'S', '`',
'H', '\x0f', 'M', 'S', '[', 'B'
};

for (size_t i = 0; i < sizeof(cipher); i++) {
printf("%c", cipher[i] ^ key[i] ^ (rand() % 256));
}
getchar();
}

void get_flag() {
int password;
int magic;
srand((unsigned int)time(NULL));

const char key[] = "Do_you_know_why_my_teammate_ddaa_is_so_angry??????";
const char cipher[] = {
'\x02', '#', '\x1e', '>', '\x14', '"', '6', '\x05', '*', '\r',
'\x10', '\x00', '\x1e', '\x1b', '&', ')', '\x08', '\x0b', '&', '+',
'\x0c', '\x0c', '\x1d', '\x02', '\x13', '\x00', '\x04', '1', '\x10', ';',
'P', '\x0f', '\x00', '\x1e', '\x1a', '1', '\x17', '\x00', '(', '\x12',
'1', '\x14', 'A', '\x1a', 'J', 'M', 'V', 'K', 'F', 'B'
};

password = rand();
printf("Give me magic: ");
scanf_s("%d", &magic);

if (password == magic) {
printf("Success!!!\n");
for (size_t i = 0; i < sizeof(cipher); i++) {
printf("%c", cipher[i] ^ key[i]);
}
} else {
printf("Failed. QQ\n");
}
getchar();
}

int main() {
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stdin, NULL, _IONBF, 0);
get_flag();

if ((std::uintptr_t)&main == 0xddaa) {
get_flag2();
get_flag3();
}

return 0;
}

g++ -g -o Winmagic.exe .\Winmagic.cpp -fpermissive 來編譯上面的程式碼。

Exploitation

get_flag1

首先是 get_flag() 會去比對輸入和一個隨機的值,我們可以透過在比較前下斷點使用 windbg 將輸入改成正確的隨機值就能拿到 flag。
我們先把程式跑起來之後用 windbg attach 上去,然後透過 bp get_flag 來下斷點之後用 g 繼續執行,透過左上角的 break 來繼續分析,我們可以透過 uf get_flag 來反組譯這個函式,可以看到以下的片段:

1
2
3
4
5
6
7
8
56 00007ff7`438e178b 488d45f0        lea     rax,[rbp-10h]
56 00007ff7`438e178f 4889c2 mov rdx,rax
56 00007ff7`438e1792 488d057a880000 lea rax,[Winmagic+0xa013 (00007ff7`438ea013)]
56 00007ff7`438e1799 4889c1 mov rcx,rax
56 00007ff7`438e179c e8ef6a0000 call Winmagic!scanf_s (00007ff7`438e8290)
58 00007ff7`438e17a1 8b45f0 mov eax,dword ptr [rbp-10h]
58 00007ff7`438e17a4 3945f4 cmp dword ptr [rbp-0Ch],eax
58 00007ff7`438e17a7 755c jne Winmagic!get_flag+0x168 (00007ff7`438e1805)

其中 scanf 是我們的輸入,而 cmp 的部分就是在比較我們的輸入和隨機值,所以我們可以透過 bp 00007ff7`438e17a4 在比較前下斷點,然後我們繼續之後隨便輸入一個數字之後按 Enter 可以看到 windbg 停在比較的斷點上,然後我們可以透過 r eax = poi(隨機值的地址) 將我們的輸入設定成隨機值:
poi
接著 g 之後就可以看到程式輸出 flag:
pwn

get_flag2

這個簡單許多,因為程式本身是不可能執行到 get_flag2 的,所以我們可以直接在 attach 上去之後先 bp main 然後執行 g 讓程式停在 main,接著我們直接透過 r rip = get_flag2 把 rip 設成 get_flag2 的位置,接著 g 就可以看到 flag 了。
flag2

get_flag3

這次的情況不僅不會執行到,甚至輸出前還會 xor rand(),讓我們會看到輸出是一串亂碼,所以我們可以在每次 xor rand() 時把存著 rand 的暫存器設成 0,但是一個位元做一次太麻煩所以我們可以用 Condition Breakpoint 來幫我們完成這些繁瑣的操作,參考指令如下:
bp 00007ff6`4b481656 ".if @eax !=0 {r eax = 0; g}.else{g}"
執行結果:
flag3

  • Title: AngelBoy Windows Binary Exploitation Winmagic Writeup
  • Author: kazma
  • Created at : 2024-11-18 12:55:50
  • Updated at : 2024-11-19 21:11:00
  • Link: https://kazma.tw/2024/11/18/AngelBoy-Windows-Binary-Exploitation-Winmagic-Writeup/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
AngelBoy Windows Binary Exploitation Winmagic Writeup