linux靜態庫 動態庫 去符號 符號恢復
前言
最近遇到了一題去除符號的題目,需要進行符號修復。為此學習了一波,順便補了補其它的一下知識。
準備知識
命名方式:
動態庫libxxx.so.major.minor .so .dll
靜態庫:libxxx.a .a .lib
生成動態庫 gcc -shared -o libxxx.so.1.0 hello.o
生成靜態庫 ar cqs libxxx.a hello.o
用於設定動態庫的路徑 export LD_LIBRARY_PATH
用於設定靜態庫的路徑 export LIBRARY_PATH
ldd工具:檢視依賴的動態庫和靜態庫
nm工具:檢視靜態庫和動態庫中的函式名。T類當前庫中定義的,U類表示是被呼叫的,W類表示可能被覆蓋的
strip工具 可以去除程式的符號,縮小程式體積
在linux下gcc預設的編譯選項就是動態庫
ar -r 更新靜態庫
ar -d -v libxxx.a module.o 刪除靜態庫中的某一模組
ar -t libxxx.a 列出靜態庫中包含的模組
ar -s 相當於ranlib,用於更新符號索引表
實驗
首先我自己寫了個簡單的hello程式
動態連結
IDA下檢視
使用strip 去除符號
靜態連結
gcc -static t.c -o t
使用nm檢視時可以看到大量的輸出。
ldd的輸出
使用strip去除符號後同動態連結類似。
使用IDA開啟…
恢復符號-FLIRT簽名技術
注意一下相關工具在ida的目錄下,可以找到flirt.zip,解壓出來即可
建議看一下flirt的readme.txt。
Typical scenario of a signature creation is:
- run a parser and create pattern (PAT) files
- run sigmake and get EXC file with collisions
- edit EXC file and resolve collisions
- run sigmake again and get SIG file
- repeat the above 2 steps till collisions exist
- run zipsig and get compressed SIG file
注意一下不同環境下的庫檔案,用來生成PAT檔案的工具時不同的,linux下使用pelf工具生成PTA
plb.exe/plb——OMF庫的解析器(Borland編譯器常用)
pcf.exe/pcf——COFF庫的解析器(微軟編譯器常用)
pelf.exe/pelf—— ELF庫的解析器(許多Unix系統常用)
ppsx.exe/ppsx—— 索尼PlayStation PSX的庫解析器
ptmobj.exe/ptmobj——TriMedia庫的解析器
pomf166.exe/pomf166——Kiel OMF 166物件檔案的解析器
我在嘗試使用pelf生成pat時,一直報錯,我認為是因為libc的版本原因。
隨後我在晚上下載了一個低版本的libc.a檔案,可以正常的生成pat檔案。
接下來使用sigmake GCC.pat GCC.sig
生成簽名檔案。
可以看到有13個衝突,要想成功的生成簽名檔案就必須解決衝突,同時我們還可以看到生成了.exc檔案
檢視內容如下圖:
可以看到說明,由於某些函式的簽名相同,因此sigmake需要你來決定該如何抉擇。”+”代表應用該函式,”-“代表只在資料庫中新增該函式的註釋,不做處理代表你不想應用任何一個函式。
在解決衝突時需要注意以下幾點:
1. 為最大限度地減少衝突,請刪除排斥檔案開頭的四個註釋行。
2. 最多隻能給衝突函式組中的一函式附加+/-。
3. 如果一個衝突函式組僅包含一個函式,不要在該函式前附加+/-,讓它保持原狀即可。
4. sigmake連續執行失敗會將包括註釋行的資料附加到現有的任何排斥檔案後。再次執行sigmake之前,必須刪除這些附加資料,並更正原始資料(如果這些資料正確,sigmake將不會再次執行失敗)。
修改.exc檔案後重新使用sigmake GCC.pat GCC.sig
命令,如果不在報錯,說明sig簽名檔案生成。
將簽名檔案拷貝到IDA的/sig/pc目錄下(這個路徑找了好久,網上很多教程說放在/sig目錄下即可,但是7.0的ida需要放在/sig/pc目錄下才能被正確識別,同時注意flair的版本同ida的版本要對應!)
IDA中使用shift+F5,然後右鍵【Apply new signature…】視窗,選擇生成的sig簽名檔案。
最終成功的匹配上了46個func,這是因為用來生成簽名的libc.a版本太低了,而高版本的又生成不了簽名檔案。(我也不知道是不是因為版本的問題)
總結
這篇文章只是基礎的知識。linux就是需要多折騰!