---
# System prepended metadata

title: ' 11/24 逆向工程'
tags: [社團課, 資安演講, 共筆]

---

# 11/24 逆向工程
###### tags: `共筆` `社團課` 
[TOC]

:::info
❤歡迎各位參與共筆的製作❤
講師:七維思資安股份有限公司 吳俊漳 營運長
:::
## 逆向有何用?
- 惡意程式分析( 勒索、木馬、挖礦病毒 )
- 程式分析
- 露洞挖掘
    - 黑帽駭客
        - 挖掘露洞賣黑市
        - 勒索廠商
    - 白帽駭客
        - 挖掘露洞通報商
        -   獎金獵人( Bug Bounty )
    - 灰帽駭客 
        - 遊走兩者間
- 破解軟體( !!!非法!!! )
- 遊戲外掛( !!!非法!!! )
    - 修改RAM、網路封包 
## 作業系統 ==> 執行檔
![image](https://hackmd.io/_uploads/SyNp5-UH6.png)

### Lab0 - file
DiE (Detec it Easy) : 拿APP格式(Win)

```
$ file unknown0
```
unknown0: ***ELF 64-Bit*** LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=3f9eff27a32fda4c691a6f8013ae79d43412a131, for GNU/Linux 3.2.0, not stripped
> lINUX
```
$ file unknown1
```
unknown1: ***PE32***+ executable (console) ***x86-64***, for MS Windows
> Windows
```
$ file unknown2
```
unknown2: ***Mach-O*** 64-bit x86_64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|PIE>
>Mac OS
## Binary File
- 任何檔案都是Binary File
- 執行檔 ==> Binary File ( 俗稱 )
- xxd : 觀察程式Binary值( 16進位表示 )
## Magic Number
Mac / Linux ```xxd```查詢

| 檔案16進為碼 | 文字 | 解釋 |
| -------- | -------- | -------- |
| FF D8 FF E0 00 10 4A 46     | ![image](https://hackmd.io/_uploads/H1xmgGIBa.png)| JPEG圖片檔     |
| 89 50 4E 47 0D 0A 1A 0A     | ![image](https://hackmd.io/_uploads/BkYwZGLBa.png)| PNG圖片檔     |
| FF D8 FF 00 10 4A 46     | ![image](https://hackmd.io/_uploads/SJsdZz8rT.png)| Windows執行檔     |
| FF D8 FF 00 10 4A 46     | ![image](https://hackmd.io/_uploads/HkIF-fIH6.png)| ZIP壓縮檔     |
| FF D8 FF 00 10 4A 46     | ![image](https://hackmd.io/_uploads/B1l5bG8Ba.png)| Linux執行檔     |
| FF D8 FF 00 10 4A 46     | ![image](https://hackmd.io/_uploads/B199-z8HT.png)| PDF檔     |
- **僅供參考! 絕不能完全相信**

EX: ![image](https://hackmd.io/_uploads/SyU2FzLHa.png)


## HxD
觀察、修改 Magic Number
- 功能 == Mac / Linux ```xxd```指令

![image](https://hackmd.io/_uploads/rk21NMUB6.png)

### Lab1 - xxd
找出前2 Bytes (前4個16進位符號)
![image](https://hackmd.io/_uploads/HkB3LfLH6.png)
![image](https://hackmd.io/_uploads/SkuaUf8rT.png)
![image](https://hackmd.io/_uploads/B1sRLGUrp.png)

## 程式碼編譯流程
![image](https://hackmd.io/_uploads/rJKJAfIH6.png)
## 逆向工程
![image](https://hackmd.io/_uploads/H129emUHp.png)
### 組合語言&機器碼
![image](https://hackmd.io/_uploads/SkYSQXIBa.png)
![image](https://hackmd.io/_uploads/r1VLm78BT.png)
### 組合語言
- 可對應機器語言
- 需要再查

![image](https://hackmd.io/_uploads/HyuNV7IB6.png)
[x86asm](http://ref.x86asm.net/coder64.html)

## Binary架構


| Linux ELF |
| -------- |
| ELF Header     |
| Program header table     | 
| .text     | 
| .rodata     | 
| .........     | 
| .data     | 
| Section header table     | 


| Windows PE( exe ) |
| -------- |
| DOS Header     | 
| PE Header     | 
| Optional Table     | 
| Section Table     |
| .text     |
| .data     | 
| .......     | 

![image](https://hackmd.io/_uploads/B1WV5XISp.png)

### Hash
雜湊、哈希 ( **!!不==加密!!** )
- 需多常見算法 ( MD4、MD5、SHA1、SHA256...... )
- 簡單理解: 把程式所有內容丟果汁機打一打，然後咬一勺出來
- 密碼學原理
    - 理想: 每個檔案都會有不同Hash值
    - 用Hash值 幫程式做唯一的身分證號 
可信度: 有不可信 ( 資安世界裡沒有東西100%安全 )
- 鴿籠原理 導致Hash碰撞
> 鴿籠原理: 每個籠子只能關1之鴿子、有10個籠子+12之鴿子議定要關進去至少有2個籠子有2之鴿子

> Hash 碰撞: MD5有16Bytes( 有2^128種組合 )
> 最糟 2^128+1個不同檔案
> 出現至少2個Hash值一樣 但內容不同

Hash 於惡意程式分析應用
- 惡意程式分析、威脅研究、數位鑑識領域
- 通常用 Hash值 代表一個檔案

### 程式中的字串元素
- 程式所又變數
- 都會用明文儲存在 .data 或 .rodata
![image](https://hackmd.io/_uploads/HkAsLeoH6.png)

### 常用軟體
- Linux: strings、xxd、grep、readelf
- Windows: PE Studio
![image](https://hackmd.io/_uploads/S1VCDxsBa.png)

### LAB2 - readelf
針對 Find 檔案 - 找出gcc版本

```
$ readelf -a find    #-a : 看全部
```
```
$ readelf -p .comment find #-p : 看特定部分
                           #.comment查看 ELF 檔案的 .comment 部分(通常包含一些關於程式或庫的註釋信息。)
```
![image](https://hackmd.io/_uploads/HJosNXg8T.png)
--- 
找出Flag
>![image](https://hackmd.io/_uploads/Hk8NHQeI6.png)

[正規表達式?](https://https://www.google.com/search?q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E9%81%94%E5%BC%8F&sourceid=chrome&ie=UTF-8)
```
strings find | grep -o 'AIS3{[^}_]*_[^}]*}'  #-o : 看匹配的部分
                                             #     使用正規表達式匹配
                                             # ^ : 反向
                                             # * : n次
```

![image](https://hackmd.io/_uploads/B1T5DQg8a.png)

## 系統底層
### Linux System Call
系統呼叫
- user space 向system kernel 請求高權限的服務 ( 執行最底層函數 )
> ![image](https://hackmd.io/_uploads/rk7Un4E8T.png)

Hello World怎寫? 
```
#incude <stdio.h>
int main()
{
    print("Hello Smallko");
}
```
> Printf太高階了?

更低階的Hello World
```
#incude <stdio.h>
int main()
{
    write(1,"Smallko",4);
}
```
```
#incude <stdio.h>
int main()
{
    char str[] = "Smallko";
    write(1,str,4);
}
```
> write? : Linux System Call

### Linux System Call Table
![image](https://hackmd.io/_uploads/BJIbGrNU6.png)
[我不是Linux System Call Table](https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/)