在此次洩露的Flash 0Day的利用程式碼都包含針對Mac OSX 64比特系統的利用,以往在網上看到的大多是windows平臺32/64比特的利用程式碼,很少有Mac版的flash利用程式碼曝光,剛好可以借機分析學習下軍用級武器的寫法。
【源碼分析】
下麵以第1個HackingTeam洩露的CVE-2015-5119Flash 0day漏洞中的利用程式碼為例:
1、內在中暴力蒐索Mach-o檔案頭magic標記0xfeedfacf(類似蒐索windows平臺下的PE頭MZ標記),它代表64比特程式的意思,也是MacOS X上可執行文件的開頭。
可以用otool或者MachOView查看Mach-o可執行檔案格式:
2、在Mach-o檔案頭之後是加載命令(LoadCommand)區域,接下來程式蒐索用於映射檔案中的段到行程記憶體空間的LC_SEGMENT_64加載命令,遍歷每個被加載的段,找到包含段標記為S_SYMBOL_STUBS(代表包含符號資訊)和S_ATTR_PURE_INSTRUCTIONS(代表包含機器碼)的段,然後獲取段地址Address、偏移量Offset、Size、Stubs Size、Stubs數量以及Indirect Sym Index(間接符號錶索引值)。
3、找到_LINKEDIT段,從中獲取相應的虛擬地址和檔案偏移,然後互减得到兩者之間的偏移量。
4、獲取LC_SYMTAB加載命令的相關資訊,該命令用於指定檔案所使用的符號錶,找到後分別獲取符號錶偏移量、符號數、字串錶偏移量、字串錶大小
5、獲取LC_DYSYMTAB加載命令的相關資訊,該命令用於指定動態連結程式庫所使用的符號錶,找到後獲取間接符號錶偏移量
6、將前面獲取的符號錶地址、間接符號錶地址和字串錶地址分別加上第3步獲取的偏移量
7、從前面獲取的3個值,去字串錶中索引mprotect函數,找到其對應的記憶體位址,以利用它去真正的shellcode部分賦予可執行許可權(這部分與Windows平臺上的程式碼基本一致),以繞過DEP的保護。
8、前面都是為執行接下來x64 shellcode程式碼而作的準備,由於vfork所創建的子行程與父行程共亯數據,囙此可用於檢測是否位於沙箱中,若在沙箱中vfrok會執行失效,進而退出執行。
9、通過為syscall指定調用號來調用execve函數,以執行“/Applications/Calulator.app/Contents/MacOS/Calculator”打開小算盘,然後再調用exit退出子行程。
10、設定返回值為int atom類型,左移3比特是為了對最後3 bits清零,因為它代表著atom類型,再加6是為了設定為int atom類型,因為shellcode相當於自定義函數,它是用於替換payload的JIT函數去執行的,最後彈出棧數據,以維持棧平衡。
【總結】
此次的Mac OSX 64比特平臺的利用,主要還是先根據Maco-o檔案頭標記找到flash模塊,然後去索引符號錶、間接符號錶和字串錶,進而找到mprotect函數的地址,將shellcode區塊設定為可執行許可權。真正用於彈出小算盘的shellcode程式碼相對比較簡單,向syscall傳遞調用號來執行execve函數,進而打開指定的程式檔案Calculator,實現最終的任意程式碼執行。