--- title: Reverse --- # Reverse 0x1 by Roy > Reverse~ > [投影片](https://drive.google.com/file/d/1VZtP69Aa_83JPZ0qlzNBZ2WL6DQXhz24/view?usp=sharing) > [課程影片連結](https://youtu.be/WxByi_yI8RA) > [sli.do 匿名發問](https://app.sli.do/event/hkbgehvp?utm_medium=hp)(連結已關閉) > [課後問卷](https://docs.google.com/forms/d/e/1FAIpQLSdMo3HweOk08cdMtb-S5GLxRrO0MTLTAXlnsbTlKQUx4Go0BQ/viewform) ## 環境 * [VM](https://drive.google.com/file/d/1tQCRVOnSP_MXj_7vN3hEDFc-NbHXsH_H/view?usp=sharing) * VM 分流 * `Z:\\NISRA\Reverse` * VM帳號密碼 * `nisra/nisra2020` * 任意 disassembler e.g. IDA Pro, Ghidra ## 編譯流程 - source - preprocessed source - assembly - object file - excutable ### Preprocess - 預先處理 - 展開指令、刪除註解 ```gcc -E test.c -o test.i``` ### Compilation - 黑魔法 - 原始碼進去,出來就是組語 ### Assemble - 組譯 - 組合語言變成程式碼 - 常用 ```gcc -c test.c -o test.o``` ### Linking - 連結 - 把多個 Object file 組裝成一個執行檔 #### Static Linking - 把Library也編譯到執行檔中 - 執行檔大小比較大 - 如果Library有更改,則依賴的code要重編 #### Dynamic Linking - 到執行期才將Library載入到記憶體 - 執行檔大小比較小 - 如果Library有更改,code不用重編 ## x86 assembly - registers - Genertal purposed registered - RAX(64bits)、EAX(32bits) - AX(16bits)、AH(8bits)、AL(8bits) - ![](https://i.imgur.com/sXVWNlQ.png) - r8~r15(64bits) - rXb (32bits) - rXw (16bits) - rXb (8bits) - 特殊暫存器 - Stack Pointer - RSP 指向Stack頂端 - RBP 指向Stack底端 - Base Pointer - Program Counter - Flag Register - eflags 指令執行結果 - e.g. ZF(zero)、CF(carry)、OF(overflow)、...etc - Segmentation Registers:儲存記憶體區段 - CS (code) - SS (stack) - ES (extra) - FS、GS - Intel - mov eax, 0x10 - AT&T - mov &0x10, %eax ### 指令(intel) #### 無中括號者操作其記憶體位址,有中括號者操作其數值 - [wiki](https://zh.m.wikibooks.org/zh-tw/X86%E7%B5%84%E5%90%88%E8%AA%9E%E8%A8%80/X86%E6%9E%B6%E6%9E%84%E5%8F%8A%E5%AF%84%E5%AD%98%E5%99%A8%E8%A7%A3%E9%87%8A) - mov - mov ezx,ecx - mov [eax],ecx (有中括號類似指標) - add/sum 加減 - reg, imm - reg, reg - or/and/xor - mul/div - reg/imm e.g.mul ecx ; edx:eax = eax * ecx (會把溢位的東西放到edx) - push/pop reg (Stack操作) - push reg 等同於 sub esp, 4; mov [esp], reg; (用sub是因為stack是往下長的) - pop reg 等同於 mov reg, [esp]; add esp, 4 ~~沒有投影片好難做筆記QQ~~ - jmp/call/ret 無條件跳轉 - jmp 跳轉到 - call reg = - push eip+4 (呼叫function) - jump eip (投影片寫錯了) - ret = pop eip = - mov eip, [esp] - add esp, 4 - 條件跳轉 - 看eflags - 有分成 有號整數(Signed,g、l)跟無號整數(Unsigned,a、b) - je 等於的時候跳 - jne 不等於的時候跳 - cmp 比較兩個東西 - test - e.g. test eax, eax (看eax是不是0) [指令表](https://www.felixcloutier.com/x86/) ## Reverse ### 指令 - file(檢視程式相關資訊) - strings(爬程式中的字串) - grep(過濾關鍵字串) - ltrace(列出程式的使用的library call)、strace(列出程式的使用的system call) ### 靜態分析 - objdump - `objdump -M intel -d <elf>` - IDA Pro - 強大的反組譯工具,有推導功能(asm -> C) - 貴 - Ghidra - 來自NSA的工具,開源且免費 - 有推導 pseudo code 功能 ### 動態分析 - gdb - GNU Debugger - 可以安裝插件 e.g. peda, pwngdb --- #### gdb操作 - gdb [-x script] ./binary - 下中斷點 - break *addr - break *symbol+123 - break symbol --- ###### tags: `Enlightened` `NISRA` `2020` <style> .navbar-brand::after { content: " × NISRA"; } </style>