欲成其事先利其器。要想完成一項複雜的任務,工具的作用至關重要。要想在Linux系統上開發或研究木馬病毒等特殊程式,我們需要使用一系列強大的開發和調試攻擊。本節先介紹幾種在Linux系統上極為強大的工具。
第一個當然是gdb了,在Linux上,它是唯一能用于程式調試的利器。我們後面開發代碼或調試分析其他病毒或木馬的設計模式和原理時,必須使用gdb作為手術刀,對要研究的病毒和木馬進行”剖屍檢驗“,通過gdb調查木馬或病毒的代碼設計方法,同時也使用gdb加載惡意代碼,研究其運轉流程。
第二個是objdump,它的作用是将惡意代碼所編制成的可執行檔案内部資訊抽取出來,例如如果病毒或木馬最後編譯成ELF格式的可執行檔案,那麼我們可以使用該工具将裡面的各種資訊展示出來,舉個例子,使用C語言寫一個helloworld程式如下:
#include "stdio.h"
void main() {
printf("hello world!");
}
複制
然後使用gcc編譯成可執行檔案,指令如下:
gcc -Wall -g hello_world.c -o hello_world
複制
注意到gcc也是在Linux上進行程式開發必不可少的編譯器。執行上面代碼後會在目前目錄生成elf格式的可執行檔案hello_world,然後使用如下指令列印其内部内容:
objdump -D hello_world
複制
執行後所得結果如下:

可以看到,ELF檔案其實由很多”section”組成,它也稱為”段”,了解這些段的作用就可以找到注入惡意代碼的機會,或者當程式被加載運作時,可以掃描其記憶體結構進而擷取有關程式的關鍵資料,例如制作外挂。
還有一個強大的工具就是objcopy,它能讓我們非常友善的修改ELF檔案中段的資料,這樣我們甚至不需要寫代碼就能對ELF對應的程式進行劫持。它的使用方法如下:
objcopy --only-section=.data ./hello_world hello_world_data
複制
這個指令的作用是把infile對應的elf檔案中資料段的内容複制到hello_world_data檔案,後面我們會詳細研究其作用和使用方法。
還有一個強力工具叫strace,它能追蹤程式對系統API的調用情況,甚至能發現程式從檔案中讀取了那些資料,首先建構一個名為hello.txt的文本檔案,裡面包含一行字元串:“hello world!”,然後建立sys_read.c,在裡面調用系統接口open和read來讀取檔案内容:
void main() {
int fd = open("hello.txt", O_RDONLY);
printf("fd is %d", fd);
char buffer[10];
read(fd, &buffer, 10);
printf(buffer);
}
複制
然後使用gcc如前那樣将其編譯成格式為elf的可執行檔案sys_read,接着調用如下指令:
strace -c ./sys_read
複制
然後可以看到如下資訊,其中展示了程式對系統接口的調用情況統計:
使用如下指令可以檢視程式在調用系統API Read 時讀入的資料:
strace -e read ./sys_read
複制
執行後結果如下圖:
可以看到read函數讀入的内容被顯示出來。另外一個類似工具叫ltrace,它的作用是能發現程式執行時加載了那些動态連結庫,同時列印出程式對連結庫内的函數調用。
如果要分析ELF可執行檔案格式内容,一個必不可免的工具為readelf,它能有效讀取elf檔案内各種關鍵資訊。該工具在後續章節中将會被大量使用。幾個常用方法為:
readelf - S ./sys_read
複制
它讀取可執行檔案sys_read的段頭表,該表的具體内容後面我們會介紹。
readelf -s ./sys_read
複制
該指令讀取可執行檔案的符号表。
readelf -r ./sys_read
複制
該指令讀取可執行檔案的重定向入口。
在linux系統上還有一系列虛拟系統檔案或裝置能用于讀取目前運作程序的各種重要資訊,例如先運作ubuntu系統上的firefox程式,然後使用pidof firefox檢視他對應的程序id,在我機器上其id為24869,然後準備執行幾個關鍵指令:
cat ./proc/24869/maps
複制
如此可以讀取該程序被加載運作時的記憶體布局和相關資訊。同時檔案/proc/kcore對應核心符号表,利用gdb加載該檔案就可以對核心進行調試和分析。檔案/proc/iomem對應核心在記憶體中的布局,例如它包含了核心代碼段,核心資料段,核心bss段等重要段資料的加載和分布狀況。這些工具和指令的更多用法将在後續相關章節中講解和使用。