---
# System prepended metadata

title: Reverse Class 1
tags: [CTF]

---

# 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 判斷出的字串