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