---
# System prepended metadata

title: '[109-1] Reverse Engineering 1'
tags: [109-1 共筆]

---

# [109-1] Reverse Engineering 1

###### tags: `109-1 共筆`

:::info
- 課堂相關資料：https://security.ntu.st/
- 直播：https://youtu.be/sGEZxiUyxi4
- 共筆：https://hackmd.io/@NTUST-Hack/B1GzUw5qD
- Slide：https://security.ntu.st/2018-rev.pdf
:::

## 什麼是逆向工程

- 從產品還原出製造過程
- 從執行檔還原出原始碼

## 記憶體與數值

- 位址(address): 記憶體中每個byte的編號
- x86使用 little-endian 編碼儲存數值
    - 0x0123456789ABCDEF
        - 存為 EF CD AB 89 67 45 23 01
- 每一個變數都會被分配到一個位址上
    - 位址就是第一個byte的位址

## 暫存器

- `RAX`, `RBX`, `RCX`, `RDX`, `RDI`, `RSI`, `R8`, `R9`…, `R15`
- 每一個都可以存 8 bytes 的整數資料
- 只取部分資料
    - E\**: 4 byte
    - \**: 2 byte
    - \*H、\*L: 1 byte，分別是 2 bytes 的左右兩個 byte

## 組合語言

* 組譯以後變成機械碼，可以給機械執行

> stack
> 先進後出，先進去的東西後出來
> 例如：疊盤子
> vs queue
> 先進先出，先進去的東西先出來
> 例如：排隊

### 常用指令

* 如果會做運算，並且改變結果，通常都會把結果存在左邊的參數

| 指令            | 用途                                                                          |
| --------------- | ----------------------------------------------------------------------------- |
| push            | 將值放進stack                                                                 |
| pop             | 將最後進的值移出，並將儲存的值存進 register                                   |
| add, sub        | 左值 = 左值 +/- 右值                                                          |
| call            | call 函式                                                                     |
| lea             | load effect address，將右位址給左值                                           |
| mov             | 將右值給左值                                                                  |
| qword ptr [rax] | 存取rax內的值指到的記憶體位址(qword可以改成dword/word，rax可以改成其他暫存器) |
| je/jne              |                                                                               |
| jg/jl           |                                                                               |
|                 |                                                                               |


