# Reverse Class 1 ## IDA initial knwoledge ### 動態分析工具 **Windows** :WinDbg Preview, x64dbg **Linux** :gdb(可搭配插件 GEF, pwndbg) ### 靜態分析工具 **IDA** : 1. 反組譯 2. 反編譯 3. Python 腳本 4. 強大插件 **Ghidra** : free in Java environment ## Assembly x86 v.s. X86-64 暫存器說明 https://tw.gitbook.net/html/assembly/2013/0813120.html ![](https://i.imgur.com/iXXrWvU.png) ![](https://i.imgur.com/QKCG3TZ.png) ![](https://i.imgur.com/pGDByxE.png) ![](https://i.imgur.com/NzsNfeq.png) ### instruction * **System call** :需先給 syscal number,並給參數(下方網址可查 syscall number 以及變數存取暫存器) https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86-32_bit :::info * x86-64 範例 ![](https://i.imgur.com/ER4tA2g.png) ::: * **CMP & TEST** :比較兩值,並記錄到 EFLAGS * syntax : cmp dst, src ![](https://i.imgur.com/9B4C6fK.png) * **JMP** ![](https://i.imgur.com/pReC8X2.png) ![](https://i.imgur.com/8vUn4et.png) * **call** :執行 func,會做兩件事 ``` push return address //將 return address 存入 stack jmp func //跳到 function 所在位置執行 ``` * **epilogue** : 實作時在 function 尾端會執行 //開頭執行 prologue ``` leave // mov rsp, rbp // pop rbp ret // pop rip ``` * QWORD : 8BYTEs(unsigned integer) * DWORD : 4BYTEs(unsigned integer) * WORD : 2BYTEs * Compile Optimization 自動優化程式,但會增加 reverse 難度 ## Stack knowledge * Stack 由位置高處往低處存 * RSP 指向 Stack 頂端 * RBP 指向 Stack 底部 ``` //EXAMPLE push rax //將 rax 值存入 stack rsp -= 8 //將 rsp 移到 stack 頂部 pop rbx //將 stack 頂端的值取出放到 rbx rsp += 8 //將 rsp 移到 stack 頂部 //註: 實際執行時 rbp 同樣需要處理,需指向 subroutine variable 起始點 ``` ## Calling Convention 呼叫函式時傳參數的方法,會根據 OS 以及 Compiler 而有所不同(下列網址可完整查詢) https://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions * Linux x86 : 參數全放 stack上,回傳值放 eax * Linux x86-64 : 參數由 rdi, rsi, rdx, rcx 依序存放,剩餘的放 stack,回傳值放 rax ## IDA * **ESC** :回上一頁 * **;** :可寫註解 * **D** :可改變 Data 顯示大小 * **N** :可對 Variable 重命名 * **Y** :可改變 Variable 資料型態 * **U** :可 Undefine assembly code * **A** :修正資料 * **X** :可顯示 calls refernece,顯示有使用到該 Variable 的位置 * **F5** :可進行 Decompile * **Space** :空白鍵可切換成 control flow mode * **TAB** :切換 Assembly 視窗 & Pseudocode 視窗 ## IDA-Pseudocode mode * 滑鼠右鍵可對兩視窗 Syncronization ,可用於 trace code * **shift+F1** :可 show 出既定結構,例如自定義的 data type,並可加以修改 * **shift+F12** :可 show 出所有 IDA 判斷出的字串