9

我最近讀了一篇題爲"All You Ever Wanted to Know about Dynamic Taint Analysis and Forward Symbolic Execution (but Might Have Been Afraid to Ask)"的文章Dr. EJ Schwartz。在論文中,他主要討論了它們在二進制安全環境中的應用。符號執行和污點分析之間有什麼差距?

我很好奇動態污點分析正向符號執行之間的確切區別。

從我所看到的,污點分析跟蹤從對象x()信息流到對象Y(水槽),每當存放在X的信息傳送到對象收率所以主要關心的是什麼對象可以被傳染性影響。雖然符號執行將一些輸入視爲符號值,並且嘗試以用符號值表示其他變量;從而它回答什麼條件符號輸入會影響後續的程序。

我可以看到,在二進制級別,穢語分析經常被提到帶有的返回地址覆蓋的;而符號執行能夠處理多種類型的脆弱的問題,如整數溢出運行時斷言錯誤資源泄漏(例如,內存泄漏,文件打開/關閉),緩衝區溢出

但是似乎現代污點分析並不僅僅涉及數據流分析,大多會跟蹤控制流條件;並且在多個漏洞檢測場景中,受污染的輸入也被表示爲符號值,並按照符號執行的方式進行傳播。另一方面,由於底層約束求解器和運行時的執行/解釋的限制,符號執行引擎不能完全使用由不同路徑條件分隔的符號值;從而無法實現預期的覆蓋率高的分支路徑覆蓋。

所以在一般情況下,我們可以說是污點分析一種粗糙的符號執行,或象徵性的執行一種精確的污點分析的?

+0

在StackExchange Computer Science或StackExchange逆向工程中發佈此問題值得一試。 – stackoverflowwww 2016-02-26 18:00:20

回答

2

有趣的問題!這是我的2美分:符號執行使用一種污點分析來構造路徑約束。符號執行還使用SMT/SAT解算器爲變量和/或輸入生成具體值,從而滿足特定的路徑約束條件。

由於污點分析不採用SMT/SAT解算器,我會說這不是一種符號執行。 也許人們可以說污點分析是符號執行的一部分

這只是一個意見。請隨時挑戰它。

0

我@Benny同意,這是一個非常有趣的問題。當你嘗試回答這些問題時,你可能會學到很多東西,甚至更多。

我想添加到Benny的答案:

爲了實現污點跟蹤和符號執行,一個具有(在二進制文件的情況下,例如x86彙編)來定義語言的語義。例如,人們必須描述什麼是「手段」,即對狀態做了什麼。污點跟蹤語義的定義,也許可以看作是一種象徵性的執行語義的的。污點跟蹤語義以符號執行語義進行編碼。公共部分是

  • 如果ebx被污染,則eax被污染。
  • 如果ebx是象徵性的(IOW包含含有一個或多個符號VARS的SMT式)然後eax是象徵

然而,對於符號執行語義必須包含進一步信息(例如精確的算術運算): - eax是「無論是eax前的」 +「無論是ebx之前」

請評論或指正!

0

在我看來,要回答你的問題,我們必須回答下面的一個:1)沒有符號執行必須找到污點分析就可以了,更多的所有執行路徑的可能; ii)污點分析是否有可能找到符號執行可以執行的所有執行路徑等等; iii)它們是否都具有找到相同執行路徑的相同潛力;四)他們都可以計算其他人不能執行的路徑。

在我看來,IV)是正確的,這意味着一個不是一個子集。但是,我確實同意這確實有重疊。

我們可以排除選項i)和III),因爲符號執行只找到可行的執行路徑,而污點分析會發現不可行的人在不訴諸約束求解。

爲了消除方案二),我認爲(糾正我,如果我錯了),有是象徵性的執行可以揭露和污點分析不能執行路徑。例如:

for(int i=0;i<3;i++) { 
    if(someString.charAt(i)=='4') 
     //do something 
    else 
     //do something else 
} 

在這種情況下符號執行暴露所有八個可能的執行路徑,而污點分析(如果我沒有記錯)沒有。

+1

如果我們將執行路徑限制爲只有*可行*的路徑,那麼由污點發現的路徑始終是通過符號執行找到的那些路徑的子集,對吧? – 2016-11-25 06:35:26

+0

我相信如此,但我們需要一個smt求解器 – 2016-11-25 07:37:11

0

我認爲關鍵的區別是執行是否是混凝土或符號 ---是否有興趣在污點傳播(用於檢查信息泄漏或控制流劫持)上的單個具體執行,或如果你想通過利用解算器的力量探索這種傳播的其他可能性動態污點分析的優點是在其低開銷和因此適合運行時監測。另一方面,(純/動態)符號執行能夠探索具體路徑以外的路徑,因此適合對您感興趣的安全屬性進行離線分析。

相關問題