通過修改Mach-O中Load Commands進行全域性程序劫持
阿新 • • 發佈:2019-01-01
Mach-O格式,是Machobject檔案格式的縮寫,是一種可執行檔案、目的碼、共享程式庫、動態載入程式碼和核心DUMP(摘自度娘),類似於Win環境的PE、Linux環境的ELF。
LoadCommands資料位於MachHeader資料之後,顧名思義為載入器命令。
Structureoverview
|--------------------------------
|MachHeader
|--------------------------------
|LoadCommand1
|LoadCommand2
|LoadCommandn
|--------------------------------
|Data
|--------------------------------
LoadCommand定義有諸多,比如LC_SEGMENT、LC_SYMTAB、LC_SYMSEG等等,更多的LC定義可在<mach-o/loader.h>標頭檔案中找到。利用otool-l命令可以檢視一個mach-o檔案的LoadCommands。
利用LoadCommands進行程序劫持的大致思路如下:
1.找一個任意程序啟動都會載入的dylib;
2.為dylib寫入自定義shellcode;
3.修改/新增此dylib的LC_ROUTINES命令,指向shellcode;
4.替換原dylib。
每步驟原理:
1.找到一個任意程序都會載入的dylib,比如/usr/lib/dyld,這樣就達到了全域性範圍的效果。
2.寫入shellcode,比如執行一段dlopen的程式碼,開啟指定動態庫,或是什麼。
3.當連結器加入-init選項時,LC_ROUTINES就會被加入到LoadCommands中,描述該dylib的入口。如此我們將原入口替換為shellcode的地址,在shellcode執行完再跳回原入口來執行自定義程式碼。
4.替換後開啟任意程序看效果。
以上是本人的假設,還沒經過實踐。歡迎大家討論
LoadCommands資料位於MachHeader資料之後,顧名思義為載入器命令。
Structureoverview
|--------------------------------
|MachHeader
|--------------------------------
|LoadCommand1
|LoadCommand2
|LoadCommandn
|--------------------------------
|Data
|--------------------------------
LoadCommand定義有諸多,比如LC_SEGMENT、LC_SYMTAB、LC_SYMSEG等等,更多的LC定義可在<mach-o/loader.h>標頭檔案中找到。利用otool-l命令可以檢視一個mach-o檔案的LoadCommands。
利用LoadCommands進行程序劫持的大致思路如下:
1.找一個任意程序啟動都會載入的dylib;
2.為dylib寫入自定義shellcode;
3.修改/新增此dylib的LC_ROUTINES命令,指向shellcode;
4.替換原dylib。
每步驟原理:
1.找到一個任意程序都會載入的dylib,比如/usr/lib/dyld,這樣就達到了全域性範圍的效果。
2.寫入shellcode,比如執行一段dlopen的程式碼,開啟指定動態庫,或是什麼。
3.當連結器加入-init選項時,LC_ROUTINES就會被加入到LoadCommands中,描述該dylib的入口。如此我們將原入口替換為shellcode的地址,在shellcode執行完再跳回原入口來執行自定義程式碼。
4.替換後開啟任意程序看效果。
以上是本人的假設,還沒經過實踐。歡迎大家討論