題:
將任何拱形的二進製文件提升為中間語言以進行靜態分析
frogatto
2016-04-17 12:16:31 UTC
view on stackexchange narkive permalink

背景

由於標題是不言自明的,因此我想將任何體系結構(例如x86,ARM,ARM Thumb)的二進製文件轉換為中間語言,以便應用獨立於架構的靜態分析

確切地說,我的工作僅限於Android平台APK文件中提供的共享對象。我希望IL能夠滿足的基本要求如下(實際上,我的目標是從APK文件中提供的給定 .so 文件中提取信息流)。

  • 二進制切片
  • PDG(CFG / DFG)
  • 在其維護者或其社區的大力支持下

為此目的我已經研究了下面列出的一些現有工具,但是不幸的是,我不確定是否可以使用它們來顯示信息流。

  • OpenREIL:該項目的目的是將依賴於拱的二進製文件提升到REIL。
  • Barf項目:一個多平台開源二進制分析和反向工程框架
  • Capstone:反彙編框架。
  • 史詩:此工具可將任意拱的二進製文件轉換為獨立於拱的LLVM位代碼。 (該項目不是公開的,所以我不能使用它。)

問題

是否有任何IL用於靜態分析與拱有關的 .so 文件(在APK存檔中)以提取信息流?基本上,我希望它提供切片和PDG等基本要求。

這裡的結果可能會有所幫助:https://www.google.com/webhp?q="static"+"binary+rewriting"+OR+"binary+transformation"+OR+"binary+translation"+"intermediate"+OR+ “抽象+表示”
您也可以嘗試https://github.com/zaddach/libqemu,儘管它處於早期階段。
雖然不是任意的,但是bap似乎支持將arm和x86提升到bil。
五 答案:
Jeff
2016-06-16 05:55:19 UTC
view on stackexchange narkive permalink

Radare2可能就是您要尋找的東西:

https://github.com/radare/radare2

它們將所有東西提升到中間這種語言稱為ESIL,因此可以輕鬆進行仿真。可以通過它們的庫或C,Python等中的綁定以編程方式訪問,分析和驅動此代碼。它們具有比您甚至提到的更多的體系結構和文件格式。您也許可以用它來做您需要的一切。

joxeankoret
2016-08-17 18:12:33 UTC
view on stackexchange narkive permalink

我的建議是使用libVEX,因為它是我所知道的最健壯的中間代碼庫。它是Valgrind的一部分,並支持體系結構。您可以在C / C ++程序中使用libVEX,或者使用稱為 PyVex的Python綁定。

在任何情況下:請考慮您想做的大多數事情必須從頭開始實施。我會說,除了將彙編“方言”翻譯成中間表示之外的所有內容。或者,也許您可以使用 Angr Project的某些部分。我還沒有親自測試過。

祝你好運!

VEX現在可以處理標誌計算嗎?他們忽略了語義信息,使其在某些靜態分析用例中不可行
是的,它確實執行標誌計算並調用內部檢查功能來確定是否應根據轉換後的標誌進行跳轉。
可悲的是,vex仍然不能以其自己的語法來表示所有標誌計算,仍然是惰性的輔助函數。 :/除非您自己解析所有語義信息,否則您不會從中獲得語義信息。
啊,是的,這是真的。但是,我不明白為什麼它會引起大問題。您能給我一個例子,其中VEX計算標誌+手動計算可能會出現問題嗎?還是只是因為您必須重新發明輪子而令人討厭?
它更多關於重新發明輪子。 VEX會在內部解決其助手功能。使用此信息的大多數項目(例如angr)最終都會重新實現所有幫助程序功能。
ivg
2016-09-27 17:12:16 UTC
view on stackexchange narkive permalink

我想將 BAP添加到您的列表。免責聲明,我是作者之一。我們剛剛發布了1.0.0版本。這是我們第十次公開發布(經過大約十年的內部開發)。儘管我們的目標受眾是專業研究人員和政府機構,但我們仍然擁有相當不錯的獨立研究人員社區。我們還對gitter渠道以及我們的問題跟踪器做出了快速響應。

我們的中間表示形式具有正式指定的語義,並且我們的提升器已通過我們的驗證框架進行了深入驗證。如今,我們的升降機支持許多架構-x86,x86-64,mips32,mips64,powerpc32,powerpc64和armv7。

不提及其他庫,至少包括Radare2和Angr是不公平的。

Radare2的中間表示形式稱為ESIL。它不是人類可讀的(除非您是Forth程序員),但是據信它是有效的。他們至少支持5種架構(ARM,x86,GameBoy和8051)。

Angr將VEX庫(即GPL版)用於提升器,因此它們對5種架構(x86,arm,mips,ppc,s390)具有開箱即用的支持。 VEX語言也不可讀(儘管它仍然比ESIL更好),並且失去了一些精度。我們在BAP的前身中使用了VEX,但很多年前轉移到了我們自己的升降機上。

Nordwald
2016-09-28 12:26:43 UTC
view on stackexchange narkive permalink

我審查了我正在從事的項目的大約14個中間表示形式。似乎任何作者(甚至是博士學位和碩士論文)都發現所有其他現有的IR都缺乏並發明了自己的IR。

有兩個值得注意的例外:

VEX 是進行IR的史前方法,可提供穩定的後端。話雖這麼說,它使用輔助功能來進行標誌計算之類的工作,因此可能會省略語義信息。大G買了zynamícs。一些社區項目使該概念保持活力,但引入了自己的REIL擴展。

由於靜態分析在大部分繁重的工作中都需要SMT,因此我們將IR轉換為邏輯公式並將其用作一種中間表示形式。

例如:

  pop eax  

等於:

esp = esp -4

[esp-4] = eax

嘿,諾德瓦爾德,請問您最終是否僱用了REIL?如果是這樣,為了使其能夠執行符號執行(需要提到SMT求解器),還需要執行多少額外的工作?謝謝!
一系列的REIL實現(例如BARF)已經包含對語句求解器的轉換。只需在此處查看示例:https://github.com/programa-stic/barf-project/tree/master/examples/scripts/x86
那很棒!非常感謝您提供資源。
順便說一句:請問您建議使用什麼“前端”?我有最新的IDA-Pro + Binnavi ...
嘿,我們在這裡使用內部解決方案,因為適當的cfg對於數據流分析至關重要,但是使用IDA可能會很好。我建議您遠離繁重的工作(例如製作一個導出插件)。
Eric Hoang
2016-04-18 12:17:47 UTC
view on stackexchange narkive permalink

幾個月前,我有一些相關研究。我對您的所有要求都不了解。但是,我認為您可以關注 Jakstab。它支持分析Linux ELF文件並生成控制流圖。通常,您需要修改Jakstab才能進行研究。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...