日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

elf是什么意思 elf是什么意思英語( 五 )


目標環(huán)境的可寫磁盤直接mount為 noexec,無法執(zhí)行代碼目標環(huán)境內(nèi)核監(jiān)控任何非系統(tǒng)路徑的程序的執(zhí)行都會直接告警不管什么樣的環(huán)境,我相信老紅隊都有辦法去繞過,這里我們運用上面學到的ELF知識 , 其實有一種更為簡單的解法 , 即利用interpreter 。示例如下:
$ cat hello.c#include <stdio.h>int main() { return puts("hello!");}$ gcc hello.c -o hello$ ./hellohello!$ chmod -x hello$ ./hellobash: ./hello: Permission denied$ /lib64/ld-linux-x86-64.so.2 ./hellohello!$ strace /lib64/ld-linux-x86-64.so.2 ./hello 2>&1 | grep execexecve("/lib64/ld-linux-x86-64.so.2", ["/lib64/ld-linux-x86-64.so.2", "./hello"], 0x7fff1206f208 /* 9 vars */) = 0/lib64/ld-linux-x86-64.so.2 本身應該是內(nèi)核調(diào)用執(zhí)行的 , 但我們這里可以直接進行調(diào)用 。這樣一方面可以在沒有執(zhí)行權限的情況下執(zhí)行任意代碼,另一方面也可以在一定程度上避免內(nèi)核對execve的異常監(jiān)控 。
利用(濫用)interpreter我們還可以做其他有趣的事情 , 比如通過修改指定ELF文件的interpreter為我們自己的可執(zhí)行文件,可讓內(nèi)核在處理目標ELF時將控制器交給我們的interpreter,這可以通過直接修改字符串表或者使用一些工具如 patchelf 來輕松實現(xiàn) 。
對于惡意軟件分析的場景 , 很多安全研究人員看到ELF就喜歡用 ldd 去看看有什么依賴庫 , 一般ldd腳本實際上是調(diào)用系統(tǒng)默認的 ld.so 并通過環(huán)境變量來打印信息,不過對于某些glibc實現(xiàn)(如glibc2.27之前的ld.so) , 會調(diào)用ELF指定的interpreter運行 , 從而存在非預期命令執(zhí)行的風險 。
當然還有更多其他的思路可以進行拓展,這就需要大家發(fā)揮腦洞了 。
加固/脫殼與逆向分析比較相關的就是符號表,一個有符號的程序在逆向時基本上和讀源碼差不多 。因此對于想保護應用程序的開發(fā)者而言,最簡單的防護方法就是去除符號表,一個簡單的 strip 命令就可實現(xiàn) 。strip刪除的主要是Section中的信息,因為這不影響程序的執(zhí)行 。去除前后進行diff對比可看到刪除的section主要有下面這些:
$ diff 0 11c1< There are 35 section headers, starting at offset 0x1fdc:---> There are 28 section headers, starting at offset 0x1144:32,39c32<[27] .debug_arangesPROGBITS00000000 00104d 000020 00001<[28] .debug_infoPROGBITS00000000 00106d 000350 00001<[29] .debug_abbrevPROGBITS00000000 0013bd 000100 00001<[30] .debug_linePROGBITS00000000 0014bd 0000cd 00001<[31] .debug_strPROGBITS00000000 00158a 000293 01MS001<[32] .symtabSYMTAB00000000 001820 000480 1033494<[33] .strtabSTRTAB00000000 001ca0 0001f4 00001<[34] .shstrtabSTRTAB00000000 001e94 000145 00001--->[27] .shstrtabSTRTAB00000000 00104d 0000f5 00001其中 .symtab 是符號表,.strtab 是符號表中用到的字符串 。
僅僅去掉符號感覺還不夠,熟悉匯編的人放到反編譯工具中還是可以慢慢還原程序邏輯 。通過前面的分析我們知道,ELF執(zhí)行需要的只是Program Header中的幾個段,Section Header實際上是不需要的 , 只不過在運行時動態(tài)鏈接過程會引用到部分關聯(lián)的區(qū)域 。大部分反編譯工具,如IDA、Ghidra等,處理ELF是需要某些section信息來構建程序視圖的,所以我們可以通過構造一個損壞Section Table或者ELF Header令這些反編譯工具出錯,從而干擾逆向人員 。
當然,這個方法并不總是奏效,逆向人員可以通過動態(tài)調(diào)試把程序dump出來并對運行視圖進行還原 。一個典型的例子是Android中的JNI動態(tài)庫,有的安全人員對這些so文件進行了加密處理,并且在 .init/.initarray 這些動態(tài)庫初始化函數(shù)中進行動態(tài)解密 。破解這種加固方法的策略就是將其從內(nèi)存中復制出來并進行重建,重建的過程可根據(jù)segment對section進行還原,因為segment和section之間共享了許多內(nèi)存空間,例如:

推薦閱讀