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