天天看點

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

使用IDA flair恢複去符号的庫函數名

文章目錄

  • 使用IDA flair恢複去符号的庫函數名
        • IDA flair
        • 自己制作簽名檔案
        • 自動檢測腳本

在一些時候經常遇到靜态編譯并且去符号的題目,打開的畫風就是這樣的:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

和這樣的:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

雖然說我們也可以根據參數的類型或者參數的數量手動分析出原函數的名字或功能,但無論如何也太麻煩了,再者有的時候還會有一些其他的幹擾,那更會加大分析難度,這裡提供一個簡單的還原庫函數名稱的IDA功能:flair,即庫檔案快速識别。

IDA flair

flair通過對庫檔案中的函數生成簽名,并生成對應的簽名檔案,然後和程式中的函數進行簽名比對找到比對的函數來幫助我們還原庫函數。使用也非常簡單,我們隻需将對應的簽名檔案(sig檔案)導入到IDA的對應目錄下便可使用了。

這裡有大佬制作好的簽名檔案,各個架構各個系統各個版本都有,可以自行尋找:

https://github.com/push0ebp/sig-database

使用方法是将對應的簽名檔案導入到IDA的這個目錄下:IDA 7.0\IDA_Pro_v7.0_Portable\sig\pc,然後進入IDA按shift+F5快捷鍵,也可以File->Load file-> FLIRT signature file來操作,之後可以選擇對應的sig檔案:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

在彈出的新視窗中右鍵添加sig檔案:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

為了比較好找我自己導入的,我已經将這個檔案夾裡原來的檔案備份然後删了,隻保留我自己導入的。有時候我們不知道編譯的是哪個版本的libc庫,是以可以多導入幾個簽名檔案:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

可以看到根據導入的簽名檔案不同,識别出來的函數數量也是不同的,有的比對到300+,有的卻一個沒有比對到(也和後導入,有些“本能識别出來,卻被先導入的識别了“)。然後再回去看就會發現好多函數已經完成了識别:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

當然即便是這樣,在程式中還是會有些函數還原不了,也就是沒找到庫函數,那就隻能手動還原了,但這也給我們減少了很多的工作量:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

自己制作簽名檔案

當然除此之外,還可以自己制作簽名檔案,使用IDA附帶的flirt插件即可,如果沒有可以點選我分享的連結下載下傳:

https://pan.baidu.com/s/16YOLuhWI3yM9XJKcqGBo7Q

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

之後解壓出來在\flair70\bin\linux目錄下就是生成簽名工具的檔案,要使用到pelf和sigmake兩個程式:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

接下來找到要制作簽名檔案的靜态編譯庫libc.a,一般在/lib/x86_64-linux-gnu目錄下,或者/usr/lib/x86_64-linux-gnu目錄下:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

然後将其拷貝到flair的目錄,依次執行下面兩條指令:

./pelf libc.a test.pat
#如果這句話報錯: Unknown relocation type 42 (offset in section=0x16).那麼要加一個參數:
./pelf -r42:0:0 libc.a test.pat
#如果有出現别的錯誤,繼續添加這個參數 -r錯誤号:0:0
./sigmake test.pat test.sig
           
  • 1
  • 2
  • 3
  • 4
  • 5

然後檢視是否成功,有時沒有成功就是檔案中簽名有沖突,這時不會生成.sig而是生成了一個.exc檔案:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

檢視這個檔案:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

大概意思就是有些子產品的簽名是一樣的,我們要選擇使用哪個,看紅框中的内容,大體意思就是:**在想要選擇的子產品前面标記’+’,在不确定的選擇前面标’-’,什麼也不做就會排除所有子產品,最後要删掉這四行内容。**是以我們要進行選擇,這裡我随便選的:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

選擇之後繼續執行

./sigmake ./test.pat ./test.sig
           
  • 1

然後發現還是有一個沖突:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

繼續修改test.exc檔案,這次新沖突在最下面緊接着剛修改過的内容:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

直到修改到不報錯為止,然後成功生成sig檔案:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

自動檢測腳本

這裡還有一個可能有幫助的腳本,可以檢測二進制檔案靜态編譯的是哪個庫:

https://github.com/maroueneboubakri/lscan

這個腳本使用非常簡單:

python ./lscan.py -S .sig的目錄 -f 要掃描的二進制檔案
           
  • 1

最後會輸出和哪個庫最相近:

使用IDA flair恢複靜态編譯去符号的庫函數名使用IDA flair恢複去符号的庫函數名

這裡使用的是腳本自帶的庫,也可以使用我們在上面下載下傳的庫來掃描,隻不過哪個庫目錄太多了…這裡隻是示範

參考:https://blog.csdn.net/Breeze_CAT/article/details/103788796

繼續閱讀