---
# System prepended metadata

title: Reverse
tags: [Enlightened, NISRA, '2020']

---

---
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>