---
# System prepended metadata

title: 了解data

---

# 了解data
### ELF
為一種可執行檔，裡面大致分為4個部分
1. 紀錄基本資料(ELF header)
2. 記錄程式該如何載入記憶體program header table
3. 紀錄檔案內的section header table
4. 數個分段

若要讀取elf檔，則可用command
```
$ readelf <path to executable file>
```
https://ithelp.ithome.com.tw/articles/10222650
## Dataset Categories
### architecture
archituecture是指此檔案是利用哪種架構來編成機器碼，故每種架構編出的assemble code會有不同

而architecture是利用radare2解析得到，radare2是一個可以用來做靜態與動態分析的工具，且支持許多file format與architecture
https://www.wikiwand.com/en/Radare2

### interpreter
可以使程式邊編譯與執行，且不需要像編譯時須將library一起寫入，可以邊編譯邊將其library動態載入。
https://www.wikiwand.com/zh/%E7%9B%B4%E8%AD%AF%E5%99%A8

利用lief來擷取，lief是一種可以跨平台將各種file format的格式簡化，並利用自身api來獲取資料內容
https://github.com/lief-project/LIEF

### static
便是在interpreter所說的，這個是用來判斷他是不是用dynamic linked或著是用statically linked(這種是將library一起寫入file中，但這樣會造成file的體積增加)

利用linux的指令file來查看其是否為static

### UPX_Packed
來查看是否有加殼，

利用pwntools來解析，為ctf競賽中常用的工具，但這裡不太清楚他是怎麼獲得是否有加殼。

### label
為標示此惡意軟體為哪個類別，而裡面較常見的是mirai,gafgyt,tsunami
* mirai:為殭屍病毒，感染後不會有明顯影響，會獲取電腦部分得控制權，並可能發動攻擊，像DDOS(https://www.wikiwand.com/zh-tw/Mirai_(%E6%81%B6%E6%84%8F%E8%BD%AF%E4%BB%B6))
* gafgyt:與mirai相似，皆為殭屍病毒(https://www.ithome.com.tw/news/125267)
* tsunami:為蠕蟲病毒

利用AVclass來分辨，此為python的工具，透過輸入病毒的json檔，可以分類初期為惡意病毒的哪一類
(https://github.com/malicialab/avclass)
### stripped
可以在編譯成二進位檔時將不必要的資訊移除，這樣能夠增加效率並降低disk的容量，同時能夠讓逆向工程更能執行，使二進位檔有更高的安全性。

### libraries
表示此program中引用了多少的libraries

### fcns_counts
表示在symbol tables中的functions數量
#### symbol table
symbol table是complie中，會將所有程式中的符號、變數和名字等記錄下來的資料結構。


### header_info
#### entrypoint
告訴OS程式開始執行的地方
#### header_version
#### Endianness
為表示位元組的順序，big  endian是指高位字節在前，little endian則相反
#### Class
#### OS/ABI
ABI是指程式如何呼叫硬體結構，類似API，但API並不依附於硬體，但ABI則是依附於硬體
#### numberof_sections

## segment v.s section
總體來說，section是告訴電腦程式放在哪裡、要從哪裡執行、要如何執行等，而segment則是實際的代碼與數據。

### section
每個section在同一個ELF中大小是相同的，每個section都有section header描述他，但也能出現section header 有，卻沒有實際header的狀況。
#### flags
常見flags
1. write:執行時數據可寫(1)
2. alloc:執行時需要內存空間(2)
3. execinstr:包含maching code(4)
4. strings:包含0結尾的字串(20)
5. maskos:位os的特定語言保留8位
6. maskporc:處理語言相關
#### size
section佔了多少空間
####  type
常見type
1. NULL:表示section header無效
2. progbits:表示此section需要數據
3. symtab:提供用於連結編輯的符號
4. strtab:包含一個字符串表
5. rela:重定位節，包含relocation的入口
6. hash:包含一個符號的hash表，用在動態連結時
7. note:以某種方式標記文件訊息
8. nobits:不占任何空間
9. rel:幾乎與rela一樣
10. shlib:此中section不符合ABI
11. dynsym:用於動態連結的符號表
#### entropy
#### entry_size
固定紀錄的大小
####  file_offset
邏輯上的位置
#### section names
1. .bss:位初始化的樹據
2. .comment:版本控制信息
3. .data/.data1:初始化global and local variable
4. .debug:(不懂)
5. .dynamic:動態連結之訊息
6. .dynstr:動態連結之字串
7. .dynsym:動態連結符號表
8. .fini:程式正常結束時，需要執行該section中的指令
9. .got:(不懂)
10. .hash:符號hash表
11. .init:程式開始時，先執行這裡的代碼
12. .interp:指定interpret的路徑名
13. .line:原始碼跟machine code的關係
14. .plt:procedure linkage table
15. .relname:重新定位訊息
16. .rodata:只可讀不可寫
17. .shstrtab:包含section的名字
18. .strtab:符號表中對應變量的名字
19. symtab:symbol table

reference:(https://segmentfault.com/a/1190000016664025)
reference:(https://segmentfault.com/a/1190000016766079?utm_source=sf-similar-article)
reference:(https://segmentfault.com/a/1190000016834180?utm_source=sf-similar-article)
### segment
types:
1. NULL:
2. LOAD:可LOAD的
3. INTERP:噢.INTERP SECTION相關
4. TLS:
5. DYNAMIC:
reference:(https://www.intezer.com/blog/research/executable-linkable-format-101-part1-sections-segments/)
reference:(https://man7.org/linux/man-pages/man5/elf.5.html)


