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

### 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 | | JPEG圖片檔 |
| 89 50 4E 47 0D 0A 1A 0A | | PNG圖片檔 |
| FF D8 FF 00 10 4A 46 | | Windows執行檔 |
| FF D8 FF 00 10 4A 46 | | ZIP壓縮檔 |
| FF D8 FF 00 10 4A 46 | | Linux執行檔 |
| FF D8 FF 00 10 4A 46 | | PDF檔 |
- **僅供參考! 絕不能完全相信**
EX: 
## HxD
觀察、修改 Magic Number
- 功能 == Mac / Linux ```xxd```指令

### Lab1 - xxd
找出前2 Bytes (前4個16進位符號)



## 程式碼編譯流程

## 逆向工程

### 組合語言&機器碼


### 組合語言
- 可對應機器語言
- 需要再查

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

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

### 常用軟體
- Linux: strings、xxd、grep、readelf
- Windows: PE Studio

### LAB2 - readelf
針對 Find 檔案 - 找出gcc版本
```
$ readelf -a find #-a : 看全部
```
```
$ readelf -p .comment find #-p : 看特定部分
#.comment查看 ELF 檔案的 .comment 部分(通常包含一些關於程式或庫的註釋信息。)
```

---
找出Flag
>
[正規表達式?](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次
```

## 系統底層
### Linux System Call
系統呼叫
- user space 向system kernel 請求高權限的服務 ( 執行最底層函數 )
> 
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

[我不是Linux System Call Table](https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/)