到目前為止,已建立的二進制重寫方法是動態重寫,其中二進製文件在真實輸入上運行時被重寫。想想諸如 PIN , DynamoRIO 和 Dyninst 之類的工具工具,以及諸如 qemu 之類的二進制翻譯器。
與動態重寫(精確的控制流圖恢復)相比,靜態重寫工具具有根本的挑戰。也就是說,對於二進製文件中的每個基本塊,我們需要知道其跳轉指令的可能目標集。困難在於二進製文件具有許多間接跳轉指令。例如,如果我們面對以 bx r3
結尾的基本塊,那麼我們需要進行 precise 和 reliable 值集分析(VSA)可以告訴我們 r3
在運行時可能取的值。不幸的是,這種分析通常是不確定的。但是,行為良好的編譯器會生成以某種方式結構化的二進製文件,這一事實在很大程度上是有用的。
請注意,解決CFG恢復問題將使我們能夠作為副產品解決代碼/數據分離問題。也就是說,遞歸下降反彙編可以使我們在這種情況下將代碼與代碼字節流中的數據完全分開。
在這裡,我可以參考去年在USENIX Security中引入的以下論文:
王帥,王培,吳鼎好:可拆卸拆卸。 USENIX Security 2015:627-642
他們的工具 Uroboros
是 not strike>開源的。它基於使用 objdump 的迭代線性掃描反彙編。拆卸技術本身已在較早的文章中進行了討論。儘管如此,它為實際有效的靜態二進制重寫提供了有趣的技術(或者至少是他們的主張)。他們甚至多次重寫同一二進製文件而不破壞它。最後,請注意,靜態二進制重寫很大程度上不適用於運行時代碼生成的二進製文件。
更新:
似乎有許多缺點 Uroboros
已在 Ramblr
中得到解決,在此處進行討論:
Wang等。等“ Ramblr:使重組變得更加出色”,網絡和分佈式系統安全性研討會(NDSS'17)的會議記錄。 2017
特別是,他們提到重新組裝的二進製文件沒有執行開銷或大小擴展。