# 了解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)