漫談逆向工程

逆向工程,原名Reverse Engineering,簡稱RE。關於其書面介紹我就不復制粘貼百度百科了,簡而言之就是從發佈的產品中反向分析其程序邏輯和算法——基於各種目的。

引言

準確地說,逆向工程包括軟件逆向工程——即本文所討論的,也包括硬件逆向工程。那麼硬件逆向是怎麼做的呢?據我所知,我國的芯片設計水平普遍比國外落後10年。當國外廠商已經成功流片量產X納米的芯片時候,我們還在XX納米的研發和難點攻關中掙扎。掙扎的過程之一就是芯片逆向。

一般從代理買到量產芯片後,第一步就是溶解外部封層,使用電子顯微鏡對電路進行拍攝,俗稱拍片;第二步是使用特定工具軟件(也是國外的)對照片進行切分,通過人力對自動生成的連線進行修復;第三步是將修復的連線還原成數字電路,再由IC邏輯工程師進行進一步修復;最後組合不同模塊的門級電路,還原成硬件描述語言VHDL或者Verilog。之後就和正常的流程一樣,開發、測試、模擬、仿真、流片……

ALU

扯遠了,還是回到主題上來。硬件逆向的成本動輒成百上千萬,沒有納稅人的支持是玩不起的。但是軟件逆向不同,只要一個智力正常的人,研究一兩個月,也能上XX破解論壇上分享他們的破解成果了。

這也引出了一個問題,當我們在談論逆向的時候,我們在談論的是什麼?

軟件逆向

二進制逆向就是IDA-Pro + F5一把梭嗎?Java逆向就是JADX一把梭嗎?很多接觸過逆向的新手都知道不是,他們會跳出來反駁,夾雜着一些X86/ARM/MIPS AssemblySmaliXYZ IR等等讓人不明覺厲的詞彙。雖然聽不懂,但我們也知道他們想表達什麼:逆向是一門牽涉甚廣的領域。

的確,如果HTML、CSS這些領域是“單關節運動”,那麼逆向就是“多關節運動”。前段時間有些使用node寫前後端的開發者喜歡自稱“全棧工程師”,要按照我的說法,逆向工程師纔是當之無愧的全棧。爲什麼?來看看一個逆向工程師所應該具備的部分技能:

  • 一定的軟件開發能力,熟悉數據結構、算法
  • 瞭解各種編程語言,熟悉編譯原理
  • 熟悉計算機基本原理、操作系統、編譯器、鏈接器
  • 熟悉對應平臺或者虛擬機的彙編語言(機器碼)、中間語言(字節碼)
  • ...

一個好的逆向工程師,通常也是個不錯的開發者。即便現在有各種收費或免費的反編譯器,也需要逆向工程師對代碼進行梳理、分析、審計。這就意味着逆向者需要站在比開發者更高的角度去審視,甚至比開發者更加理解他們的代碼。……

關於初衷

搞逆向這麼麻煩,要懂這個,要懂那個,直接勸退了很大一波人。但其實這些只是“術”而已,實際工作中只需要用到一部分子集,甚至只要學會使用商業工具也能幹活兒了。在我看來,逆向工程師的核心還是——強烈的好奇心

或者說,這是大部分網絡安全人員(黑客)所具備的特質。因爲好奇某個商業軟件的功能,或者好奇某個病毒蠕蟲的行爲,才走向了這條逆向之路。

逆向的過程是枯燥的。與其說逆向是技術活,在我看來更多是體力活。尤其是在分析大型軟件的時候,每天改變量名,改函數名,分析樹狀的調用路徑,……很容易讓人感到厭煩。

但是對於抱有好奇心的人而言,逆向應該是快樂的。每分析出一個軟件或者函數的行爲,就彷彿偵探找到關鍵線索或證據一樣興奮。隱藏的路徑越深,知道的人就越少,那麼被藏起來的東西也就越有價值。

關於快樂

逆向應該是快樂的,但很多人不想讓你快樂。於是有了各種符號加殼、混淆、加密、解釋執行(虛擬機)等應用增強方案,來提高逆向工程的難度。這通常是企業中端安全工程師的傑作,或者是使用了安全公司的通用安全加固方案。

所謂的逆向混淆,只有在別人不知道你的方法時纔有價值。對於通用的加固,所面臨的挑戰者甚多,其內部實現很可能已經被扒了個底朝天;而對於企業自研的方案,又通常因爲太low而被簡單繞過。所以,想讓逆向工程師不快樂的人有時候成功了,但是大部分時候還是在逆向工程師手下敗下陣來。用一朋友的話來說就是:“程序在我的設備、我的環境裏運行,難道它還能上天?”

關於現狀

應用程序是不能上天,但是逆向工程師也很難上天。記得柯南里有一句話讓我印象深刻——“如果怪盜是富有創造力的藝術家,那麼偵探充其量只是吹毛求疵的評論家”。逆向工程做的大部分都是破壞性的工作,而不像開發者那樣帶來正面價值。

目前社區中做逆向的大多是出於解謎(CTF)、軟件破解、遊戲外掛等,即便是專門討論逆向的安全論壇中,對技術細節的探討也寥寥無幾,更多是炫耀和分享自己的“成果”。天下熙熙,皆爲利來,天下攘攘,皆爲利往,除了悶聲發大財地以搞逆向賺錢的工作室外,公開分享的也就只能是爲名了。

那麼職業做逆向的情況又如何呢?專門做逆向的正經崗位應該是惡意軟件分析了,衍生出的團隊在商業環境中突出PR宣傳安全產品或者情報能力。其他小公司裏招聘做逆向的人,要麼是分析競爭對手,要麼圍繞高流量軟件的去進行分析、破解、換皮、刷粉養號等等,是在違法犯罪的邊緣來回試探。

專門做逆向的情況不多,但是將其作爲一門技能去掌握的人也不少。我自己本身也不是專門做逆向的,因爲工作需要纔去對其進行了解。除了開源軟件,也有越來越多閉源軟件的漏洞被暴露出來,你不去挖別人自然會去挖。就拿安卓每個月的安全通告來說,帶星號的漏洞簡直不要太多。

cve

圖:Android Security Bulletin—March 2020

正面價值

逆向也有作爲正面案例出現。比如對於一些開發者不再維護的軟件,出現各種原因無法使用時,通常就有正義的逆向工程師去嘗試解決困難,之前就有這麼一個例子:

help

還有比較經典的就是Linux系統中的著名的開源驅動nouveau部分功能就是通過逆向英偉達的驅動而開發的,因爲英偉達出於各種保護的原因不願意與開源社區合作而鬧了諸多矛盾,這也是下面這張圖片的根源。

Fuck Nvidia

總而言之,技術本身無對錯好壞之分,關鍵是看使用的人以及使用的目的。

後記

回想起以前在研究高通可信執行環境時,被laginimaineb的那篇博客Exploring Qualcomm's Secure Execution Environment給驚豔到了,大概那就是我心目中逆向大神該有的樣子。那篇文章不是逆向某個特定的軟件,也不是做了什麼複雜的脫殼,而是將一種在未知環境中運行的未知格式程序就那麼一字節一字節的分析出來。

qsee

要知道當時TEE尤其是高通的QSEE,在內部是被嚴密保護的,網上可以說幾乎沒有相關信息可以參考。甚至作爲開發者都要以企業名義簽署嚴格的NDA才能拿到開發工具。要在這種環境去逆向、調試、挖漏洞看似不可能,但laginimaineb接下了這個挑戰,而且還超額完成了(userspace -> QSEE Kernel)。他自己的說法是“For Fun”,我也相信他是“Fun”的。就是這樣的人,讓安全行業充滿激情和熱忱。

最後:

Stay Curious, Stay Exploring && Happy Hacking!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章