- Year
- 2024–2025
- Role
- 主題研究/實驗/簡報分享
- Team
- 個人技術分享
- Share
- 100%
專案總覽
這個頁面整理我在 B33F 50UP 戰隊讀書會獨立完成的四場技術分享。主要內容為 angr 符號執行進階實驗,以及 DLL 載入與遊戲環境中的安全議題;另外也曾分享 Windows LNK Malware 研究與 TeamT5 Camp 的 BeaverTail 惡意程式分析。
問題與動機
符號執行與 DLL 安全都涉及底層程式行為,單看文件難以理解實際限制;需要透過小型實驗與案例把抽象機制轉成可觀察結果。
angr 的狀態、路徑爆炸與 XOR 行為需要透過實驗逐步驗證。
DLL 的搜尋、載入與應用程式互動會形成不同安全邊界。
選擇主要分享內容
兩場主要分享都從可重現的程式與問題出發,但研究方向不同。可在下方切換 angr 或 DLL,分別查看符號執行與 Windows 動態連結函式庫的核心內容。
方法與核心內容
用路徑、狀態與約束求出程式輸入
分享從 angr.Project、state 與 simulation manager 開始,透過小型題目觀察符號值如何沿程式路徑傳播,再使用 find/avoid 條件尋找能抵達目標輸出的輸入。
比較 entry state 與指定位置建立 state,並處理暫存器、記憶體和 stdin 中的符號值。
以成功輸出或目標位址定義 find,並避開錯誤分支,降低無效路徑數量。
透過 8-byte XOR 實驗說明位元寬度、切片與 zero extension 對約束的影響。
逐步移除題目捷徑,保留 path explosion 與 constraint 失效的過程,說明 angr 的實際限制。
技術脈絡
angr 的核心不是直接暴力嘗試輸入,而是把程式執行狀態、分支條件與輸入值轉成求解器能處理的約束。
Project、State 與 Simulation Manager
以 angr.Project 載入目標程式後,可從 entry_state 或指定位置建立 state。simulation manager 管理 active、found、avoided 等狀態集合,分析者再以位址或 stdout 內容定義 find/avoid,縮小需要求解的路徑。
建模重點
- 不易模擬的輸入函式可從呼叫後開始,手動將 symbolic bitvector 放入暫存器或記憶體。
- 記憶體、暫存器與運算元寬度必須符合目標架構,否則 constraint 會失真或無法建立。
- 成功與失敗條件應盡量明確,避免 simulation manager 保留大量無關狀態。
XOR、BitVector 與位元寬度
分享以多組 8-byte 輸入和 XOR key 測試符號值傳播。concrete XOR 可直接計算,symbolic value 則必須使用 BitVector 操作;遇到寬度不一致時,以 zero_extend 或重新切分位元修正 constraint。
執行流程
從能人工理解的小題目開始,逐步拿掉捷徑,觀察 angr 在輸入模型與路徑條件改變後的行為。
01 — 標定成功與失敗條件
先以輸出字串或程式位址定義目標路徑與必須避開的錯誤路徑。
02 — 建立符號輸入
依輸入來源將 BitVector 放進 stdin、暫存器或指定記憶體位置,並補上必要約束。
03 — 探索並驗證結果
由 found state 求出具體值,再回到原始程式執行,確認輸入確實能抵達目標。
保留失敗實驗
『火拳のエース』案例會逐步移除 print_flag、xor_strings 等可直接定位答案的捷徑,再觀察 active state、constraint 與求解時間如何變化。失敗結果用來說明模型缺失與 path explosion,而不是只展示最後成功的腳本。
從解題腳本回到分析方法
簡報保留題目程式、state 建立方式、find/avoid 條件與位元處理,讓隊員能修改條件重新實驗,而非只能複製固定答案。
方法與核心內容
從記憶體觀察走到 DLL 內的自動化操作
分享以 Supermarket Together 為案例,先透過 Cheat Engine 找到座標與遊戲狀態,再把原本需要重複切換視窗的操作整理到 DLL 中,同時說明不同 DLL 使用方式形成的載入與信任邊界。
從數值變化縮小候選位址,確認座標、狀態與 pointer chain 的關係。
區分系統 DLL、一般函式庫、應用程式元件與載入到其他程序中的 DLL。
將反覆讀取與修改狀態的操作集中在同一程序環境,降低手動工具切換成本。
從搜尋路徑、載入來源與程序權限說明 DLL 為何同時是擴充機制與攻擊面。
技術脈絡
DLL 分享從記憶體中的遊戲狀態出發,逐步把手動定位、讀寫與重複操作整理成能在程序內執行的功能。
Cheat Engine 與記憶體定位
先在遊戲中改變座標或狀態,透過數值前後差異反覆縮小候選位址,再確認 pointer chain 是否能跨執行階段穩定取得目標資料。這個步驟用來區分畫面上的結果、暫時位址與真正可重現的記憶體關係。
DLL 的載入與執行位置
分享比較系統 DLL、一般函式庫、應用程式元件與載入到其他程序中的 DLL。DLL 進入目標程序後可直接存取同一位址空間,但也同時受到搜尋路徑、載入來源、程序權限與執行緒生命週期影響。
研究時需要確認
- 目標程序的架構、模組基址與位址偏移是否一致。
- 初始化工作是否阻塞載入流程,或在不適合的時機執行複雜操作。
- 讀寫失敗時是否保留邊界檢查與可回復條件。
從手動修改轉成自動化
原本需要在 Cheat Engine 與遊戲間反覆切換的觀察與修改流程,被整理成 DLL 內的讀取、判斷與更新邏輯。重點是把一次性的工具操作轉成可重複驗證的程式流程。
執行流程
DLL 實驗先證明記憶體資料與遊戲行為的關係,再將已驗證的操作搬進 DLL,避免同時處理太多未知因素。
01 — 建立可觀察的狀態變化
在遊戲中移動或改變數值,記錄每次操作前後的資料差異。
02 — 確認穩定的位址路徑
透過重新啟動與多次測試排除暫時位址,確認基址、offset 與 pointer chain。
03 — 移入 DLL 並驗證
將讀寫邏輯封裝後載入測試,檢查執行緒、錯誤處理與程序結束時的清理。
最小功能逐步擴充
先讓 DLL 正確載入並輸出可觀察結果,再加入記憶體讀取、狀態判斷與更新。每次只新增一項能力,能更快區分位址錯誤、載入問題或程式邏輯問題。
安全與研究邊界
相同的程序內操作技術可用於除錯、模組擴充與安全研究,也可能被濫用。分享著重於 DLL 載入機制、記憶體觀察與可重現實驗,不把未驗證的 hook 或繞過方法當成既定結果。
另外兩場讀書會分享
這兩場內容已在其他專案頁完整說明,此處僅記錄它們也曾整理成 B33F 50UP 讀書會分享。
我的貢獻
貢獻比例 100%。四場 B33F 50UP 讀書會皆由我獨立完成主題研究、實驗設計、簡報製作與現場分享。
- 01主題研究整理 angr、符號執行、DLL 與逆向相關資料。
- 02實驗設計建立 XOR、路徑求解與 DLL 行為驗證案例。
- 03簡報製作將推測與實驗結果整理成四份完整教材。
- 04讀書會分享帶領技術說明、示範與隊員討論。
成果與反思
完成四場可獨立閱讀的技術分享。頁面以 angr 與 DLL 作為主要案例,並保留 LNK Malware 與 TeamT5 Camp 延伸分享,使研究成果成為戰隊內可重現、可延伸的知識材料。