AngelBoy Windows Binary Exploitation Winmagic Writeup
Intro
Hi, 我是 Kazma~
這堂課是臺灣好厲駭 AngelBoy 的 Windows Binary Exploitation 系列課程,由於今年只有錄影檔而且沒有 lab 可以使用,所以自己試著把講師上課的 lab 還原並整理解題筆記在這邊,感謝 AngelBoy 的課程!
喔對了因為錄影檔很小聲所以我有把影片上傳到下面這個網站,然後把音量調超大,推薦大家可以用看看:
https://online-video-cutter.com/tw/volume
Lab Recover
source code:
1 | //g++ -g -o Winmagic.exe .\Winmagic.cpp -fpermissive |
用 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 | 56 00007ff7`438e178b 488d45f0 lea rax,[rbp-10h] |
其中 scanf 是我們的輸入,而 cmp 的部分就是在比較我們的輸入和隨機值,所以我們可以透過 bp 00007ff7`438e17a4
在比較前下斷點,然後我們繼續之後隨便輸入一個數字之後按 Enter 可以看到 windbg 停在比較的斷點上,然後我們可以透過 r eax = poi(隨機值的地址)
將我們的輸入設定成隨機值:
接著 g
之後就可以看到程式輸出 flag:
get_flag2
這個簡單許多,因為程式本身是不可能執行到 get_flag2 的,所以我們可以直接在 attach 上去之後先 bp main
然後執行 g
讓程式停在 main,接著我們直接透過 r rip = get_flag2
把 rip 設成 get_flag2 的位置,接著 g
就可以看到 flag 了。
get_flag3
這次的情況不僅不會執行到,甚至輸出前還會 xor rand(),讓我們會看到輸出是一串亂碼,所以我們可以在每次 xor rand() 時把存著 rand 的暫存器設成 0,但是一個位元做一次太麻煩所以我們可以用 Condition Breakpoint 來幫我們完成這些繁瑣的操作,參考指令如下:bp 00007ff6`4b481656 ".if @eax !=0 {r eax = 0; g}.else{g}"
執行結果:
- 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.