逆向工程,原名Reverse Engineering,簡稱RE。關於其書面介紹我就不復制貼上百度百科了,簡而言之就是從釋出的產品中反向分析其程式邏輯和演算法——基於各種目的。
引言
準確地說,逆向工程包括軟體逆向工程——即本文所討論的,也包括硬體逆向工程。那麼硬體逆向是怎麼做的呢?據我所知,我國的晶片設計水平普遍比國外落後10年。當國外廠商已經成功流片量產X奈米的晶片時候,我們還在XX奈米的研發和難點攻關中掙扎。掙扎的過程之一就是晶片逆向。
一般從代理買到量產晶片後,第一步就是溶解外部封層,使用電子顯微鏡對電路進行拍攝,俗稱拍片;第二步是使用特定工具軟體(也是國外的)對照片進行切分,通過人力對自動生成的連線進行修復;第三步是將修復的連線還原成數位電路,再由IC邏輯工程師進行進一步修復;最後組合不同模組的門級電路,還原成硬體描述語言VHDL或者Verilog。之後就和正常的流程一樣,開發、測試、模擬、模擬、流片……
扯遠了,還是回到主題上來。硬體逆向的成本動輒成百上千萬,沒有納稅人的支援是玩不起的。但是軟體逆向不同,只要一個智力正常的人,研究一兩個月,也能上XX破解論壇上分享他們的破解成果了。
這也引出了一個問題,當我們在談論逆向的時候,我們在談論的是什麼?
軟體逆向
二進位制逆向就是IDA-Pro + F5
一把梭嗎?Java逆向就是JADX
一把梭嗎?很多接觸過逆向的新手都知道不是,他們會跳出來反駁,夾雜著一些X86/ARM/MIPS Assembly
、Smali
、XYZ IR
等等讓人不明覺厲的詞彙。雖然聽不懂,但我們也知道他們想表達什麼:逆向是一門牽涉甚廣的領域。
的確,如果HTML、CSS這些領域是“單關節運動”,那麼逆向就是“多關節運動”。前段時間有些使用node寫前後端的開發者喜歡自稱“全棧工程師”,要按照我的說法,逆向工程師才是當之無愧的全棧。為什麼?來看看一個逆向工程師所應該具備的部分技能:
- 一定的軟體開發能力,熟悉資料結構、演算法
- 瞭解各種程式語言,熟悉編譯原理
- 熟悉計算機基本原理、作業系統、編譯器、連結器
- 熟悉對應平臺或者虛擬機器的組合語言(機器碼)、中間語言(位元組碼)
- ...
一個好的逆向工程師,通常也是個不錯的開發者。即便現在有各種收費或免費的反編譯器,也需要逆向工程師對程式碼進行梳理、分析、審計。這就意味著逆向者需要站在比開發者更高的角度去審視,甚至比開發者更加理解他們的程式碼。……
關於初衷
搞逆向這麼麻煩,要懂這個,要懂那個,直接勸退了很大一波人。但其實這些只是“術”而已,實際工作中只需要用到一部分子集,甚至只要學會使用商業工具也能幹活兒了。在我看來,逆向工程師的核心還是——強烈的好奇心
。
或者說,這是大部分網路安全人員(黑客)所具備的特質。因為好奇某個商業軟體的功能,或者好奇某個病毒蠕蟲的行為,才走向了這條逆向之路。
逆向的過程是枯燥的。與其說逆向是技術活,在我看來更多是體力活。尤其是在分析大型軟體的時候,每天改變數名,改函式名,分析樹狀的呼叫路徑,……很容易讓人感到厭煩。
但是對於抱有好奇心的人而言,逆向應該是快樂的。每分析出一個軟體或者函式的行為,就彷彿偵探找到關鍵線索或證據一樣興奮。隱藏的路徑越深,知道的人就越少,那麼被藏起來的東西也就越有價值。
關於快樂
逆向應該是快樂的,但很多人不想讓你快樂。於是有了各種符號加殼、混淆、加密、解釋執行(虛擬機器)等應用增強方案,來提高逆向工程的難度。這通常是企業中端安全工程師的傑作,或者是使用了安全公司的通用安全加固方案。
所謂的逆向混淆,只有在別人不知道你的方法時才有價值。對於通用的加固,所面臨的挑戰者甚多,其內部實現很可能已經被扒了個底朝天;而對於企業自研的方案,又通常因為太low而被簡單繞過。所以,想讓逆向工程師不快樂的人有時候成功了,但是大部分時候還是在逆向工程師手下敗下陣來。用一朋友的話來說就是:“程式在我的裝置、我的環境裡執行,難道它還能上天?”
關於現狀
應用程式是不能上天,但是逆向工程師也很難上天。記得柯南里有一句話讓我印象深刻——“如果怪盜是富有創造力的藝術家,那麼偵探充其量只是吹毛求疵的評論家”。逆向工程做的大部分都是破壞性的工作,而不像開發者那樣帶來正面價值。
目前社群中做逆向的大多是出於解謎(CTF)、軟體破解、遊戲外掛等,即便是專門討論逆向的安全論壇中,對技術細節的探討也寥寥無幾,更多是炫耀和分享自己的“成果”。天下熙熙,皆為利來,天下攘攘,皆為利往,除了悶聲發大財地以搞逆向賺錢的工作室外,公開分享的也就只能是為名了。
那麼職業做逆向的情況又如何呢?專門做逆向的正經崗位應該是惡意軟體分析了,衍生出的團隊在商業環境中突出PR宣傳安全產品或者情報能力。其他小公司裡招聘做逆向的人,要麼是分析競爭對手,要麼圍繞高流量軟體的去進行分析、破解、換皮、刷粉養號等等,是在違法犯罪的邊緣來回試探。
專門做逆向的情況不多,但是將其作為一門技能去掌握的人也不少。我自己本身也不是專門做逆向的,因為工作需要才去對其進行了解。除了開源軟體,也有越來越多閉源軟體的漏洞被暴露出來,你不去挖別人自然會去挖。就拿安卓每個月的安全通告來說,帶星號的漏洞簡直不要太多。
圖:Android Security Bulletin—March 2020
正面價值
逆向也有作為正面案例出現。比如對於一些開發者不再維護的軟體,出現各種原因無法使用時,通常就有正義的逆向工程師去嘗試解決困難,之前就有這麼一個例子:
還有比較經典的就是Linux系統中的著名的開源驅動nouveau
部分功能就是通過逆向英偉達的驅動而開發的,因為英偉達出於各種保護的原因不願意與開源社群合作而鬧了諸多矛盾,這也是下面這張圖片的根源。
總而言之,技術本身無對錯好壞之分,關鍵是看使用的人以及使用的目的。
後記
回想起以前在研究高通可信執行環境時,被laginimaineb
的那篇部落格Exploring Qualcomm's Secure Execution Environment給驚豔到了,大概那就是我心目中逆向大神該有的樣子。那篇文章不是逆向某個特定的軟體,也不是做了什麼複雜的脫殼,而是將一種在未知環境中執行的未知格式程式就那麼一位元組一位元組的分析出來。
要知道當時TEE尤其是高通的QSEE,在內部是被嚴密保護的,網上可以說幾乎沒有相關資訊可以參考。甚至作為開發者都要以企業名義簽署嚴格的NDA才能拿到開發工具。要在這種環境去逆向、除錯、挖漏洞看似不可能,但laginimaineb
接下了這個挑戰,而且還超額完成了(userspace -> QSEE Kernel)。他自己的說法是“For Fun”,我也相信他是“Fun”的。就是這樣的人,讓安全行業充滿激情和熱忱。
最後:
Stay Curious, Stay Exploring && Happy Hacking!