天天看點

核心級病毒與木馬攻防:ELF檔案的符号表和函數調用追蹤

熟悉編譯原理的同學一定了解何為符号,所謂符号其實是一種資料結構,用來描述程式設計語言中定義的特定對象。例如程式設計語言中定義的變量,函數都有特定的符号用于描述他們的性質。例如變量對應的符号中包含了變量對應的字元串名稱,變量的類型,以及變量對應的記憶體。函數對應的符号包含了函數名稱字元串,函數的傳回值類型,函數入口記憶體位址等,在代碼調試時,你把滑鼠挪動到變量所在位置,IDE就給你顯示出變量目前的取值等資訊,這些資訊就來自變量對應的符号,我在有關編譯原理的兩門課程裡對符号有非常深入的講解。

在elf檔案中存在兩種符号表,分别為.dynsym和.symtab。.dynsym包含了外部連結進來的全局變量對應符号,例如當代碼中使用printf函數時,該函數對應的符号就存儲在.dynsym中。而.symtab包含了.dynsym中的所有符号,還包括了代碼本地定義的變量和函數符号,既然後者已經包含前者的符号表,為何ELF檔案格式依然要保持兩張符号表呢,我們先用readelf -S來再次檢視可執行檔案的符号表段:readelf -S ./hello_world,在輸出的結果中可以看到,有些段對應的flag是标志A,有些是WA,如下圖:

核心級病毒與木馬攻防:ELF檔案的符号表和函數調用追蹤

其中A表示ALLOC,WA表示WRITE/ALLOC,AX表示ALLOC/EXEC,

繼續閱讀