上圖是我從《編譯系統(tǒng)透視:圖解編譯原理》里面扣出來的,基本包括編譯原理的各個主要方面,從中可以對編譯原理有個大體認識。
專業(yè)點來講,編譯原理就是介紹編譯程序構(gòu)造的一般原理和基本方法,內(nèi)容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優(yōu)化和目標代碼生成。
之前在知乎上看到過一份視頻,講的是程序員編寫的代碼如何被計算機識別,并在CPU上運行,如果你未曾學習編譯原理,推薦觀看一下(視頻時長11:34)。
污點分析是指將程序從外部獲取的數(shù)據(jù)標記為污點,然后觀察污點在程序執(zhí)行過程中的傳播,從而得到程序中的信息流等信息,里面涉及編譯原理中的詞法語法分析會多一些,主要被應(yīng)用于惡意軟件分析、攻擊代碼檢測等軟件安全性分析研究中。
記得剛參加工作那會,經(jīng)常到網(wǎng)上搜索安全論文,發(fā)現(xiàn)很多信息安全專業(yè)的學生大多有做過一份關(guān)于“污點分析”的畢業(yè)設(shè)計,你現(xiàn)在上CNKI就可以搜索到很多,尤以碩士畢業(yè)論文居多。
當時我?guī)缀醴榫W(wǎng)上所有能找到的“污點分析”論文,最后我得出幾點結(jié)論:
不求效果,但求理論高深。之前搞flash xss檢測,花了幾天時間用一堆grep實現(xiàn)的檢測工具,挖不了不到大廠的漏洞,包括淘寶、京東這些電商;但也有同學花幾個月搞flash actionscript污點分析,雖然有點作用,但從工作效率和結(jié)果看,有時高深的理論不見得適合工業(yè)界,雖然我的幾行g(shù)rep沒法拿來寫論文。
千篇一律,天下文章一大抄。下載了一堆同主題方向的論文,發(fā)現(xiàn)有的內(nèi)容改都沒改,互相亂抄。
以漏洞挖掘的主題居多,但最后總要以挖洞效果結(jié)尾,有0day自然最好,沒0day就找?guī)讉€歷史漏洞重現(xiàn)下(很多可能是特例化處理的),沒歷史漏洞就對比幾個主流開源的挖洞工具,對比效率、性能等等,最挫的就是連效果都沒有就收尾了。
有過此般經(jīng)歷后,我已很少再去翻國內(nèi)的安全論文了,學術(shù)論文可能還是以翻閱國外的為主。
污點分析技術(shù)最早是在1976被提出的,2005年左右開始,污點分析應(yīng)用于二進制漏洞挖掘的研究火了好多年,其實技術(shù)已經(jīng)相對成熟。
確實有一些人通過污點分析挖掘到不少有價值的主流軟件漏洞,但這項技術(shù)要落地為一款安全產(chǎn)品還是有很多問題的。
首要問題就是誤報率,之前有同學開發(fā)出基于污點分析的源碼審計工具,每次外部報告漏洞的時候,復盤時總說能檢測出來,只是沒人工跟進。但是,檢測出來的有成千上萬條告警,需要消耗大量人力去排查這又有什么價值呢,本質(zhì)上,還是沒發(fā)現(xiàn)嘛!
這也算是安全運營的問題,深以為,凡是能檢測到,但無法人工或自動跟進推動問題解決的,都是徒勞的。
相信有很多公司都有出過污點分析的安全審計工具,收費的或者開源的,國內(nèi)的此類安全產(chǎn)品很多最后都不了了之,所以說成熟的技術(shù)不等于成熟的產(chǎn)品。
國外比較著名的商業(yè)源碼審計工具就是Coverity和Fortify SCA,算做得最好的業(yè)界同款產(chǎn)品,但用過的人都知道,檢測出來的問題,還是需要投入很多人工成本的。
搞逆向的同學都知道IDA、JEB這些著名的逆向工具,平時在無源碼的情況下,我們直接通過它們來分析程序邏輯,無需知曉其中涉及各類反編譯技術(shù)。
反編譯算是編譯的逆過程,即將可執(zhí)行程序轉(zhuǎn)換成程序源碼的過程,如果是轉(zhuǎn)換成匯編語言,我們通常稱為反匯編;如果是其它語言的(比如C、Java、C#等等),我們統(tǒng)稱為反編譯。
不同語言的編譯過程還不一樣,比如Java是通過JVM虛擬機將字節(jié)碼轉(zhuǎn)換成CPU認識的指令,而C是直接由編譯器轉(zhuǎn)換機器碼供CPU執(zhí)行的,因此它們的反編譯過程也不一樣。
所以如果不懂編譯原理,又如何開發(fā)反編譯工具呢?
有了反編譯,自然就有了防反編譯的工具,因此造就了各種加殼工具的出現(xiàn)。
未知攻,焉知防。要開發(fā)加固工具,就需要知道反編譯原理,要知道反編譯原理,又需要知道編譯原理。
編譯原理 <---> 反編譯原理 <---> 加固原理
搞文件Fuzzing,我們可以在樣本(收集、篩選、精簡)和Fuzzer(策略、方向等)上面下功夫,甚至簡單地暴力fuzzing文件都可以挖到漏洞。
但對于JavaScript、CSS、Flash ActionScript這些腳本呢,直接簡單地暴力變異文件根本無法進入正常的解析,做的大多是無用功。
因此我們需要一個能夠準確生成代碼的語法生成器,再用它生成fuzzing樣本,這里主要涉及編譯原理中的語法分析。這方面有著名的開源工具funfuzz(https://github.com/MozillaSecurity/funfuzz)、domato(https://github.com/google/domato),下圖就domato生成js代碼的語法模板片段:
除此之外,通過對clang/gcc等開源的編譯工具對目標源碼進行插樁,以幫助監(jiān)控fuzz樣本的代碼覆蓋率,反饋給fuzzer作改進,以進一步提高代碼覆蓋率,這塊叫“驅(qū)動反饋(feedback-driven),比如著名工具就是afl、libfuzzer、honggfuzz,以后有機會可以專篇講解此技術(shù)。
還有通過編譯器增加防漏洞利用的機制,比如GS、CFG等安全機制,在對抗漏洞攻擊上也起到了不小的作用。
所以通過研究llvm、gcc等編譯項目,對漏洞攻防領(lǐng)域也是有一些可作為的地方。
編譯原理在逆向工程、漏洞攻防、軟件開發(fā)等諸多領(lǐng)域有所應(yīng)用,有時就看你怎么使用,也并不是每個人在安全工作領(lǐng)域中有機會運用到,但技多不壓身,不妨多儲備點知識,以免到了“書到用時方恨少”的地步。
聯(lián)系客服