iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 30
1
Security

看完眼眶濕濕的App開發者慘烈對抗險惡資安環境血與淚的控訴!系列 第 30

Day 30. 要別人看不懂,還是讓自己看不懂的 - 混淆 Obfuscation

App 混淆再資安保護領域來說,可謂是最複雜的一環,也是最重要的一環

但是資安檢測無法有個標準的檢核方式,因此在資安檢驗只有建議,並沒有強制要求此項

另外外在販售的 APP保護服務,都在混淆這個基礎上下功夫

回到正題,混淆到底是混淆什麼,混淆的重要性到底在哪

image-20201015180610208

反編譯(Decompiling)流程

要了解混淆重要,要先從 app 反編譯講起,知道別人是怎麼破解app 才能知道需要怎麼保護

提取 APP .ipa 檔案 & 砸殼

從 App Store 安裝的 APP,其中 .ipa 檔案都有 FairPlay DRM 保護 ,所以單純從 App Stroe 想直接反組譯是不行的

因此需要先進行「砸殼」,砸殼工具很多 dumpdecryptedfrida-ios-dump 、clutch、gdb....

砸殼:保護手段叫做加殼保護,相之的去掉保護就叫「砸殼」 又稱為脫殼

想深入讀者可以參考 OWASP Acquiring the App Binary 如何提取二進位檔

有詳細說明如何「砸殼」(刪除 FairPlay DRM)

用 debug下產生的 ipa 或者是release下的ipa ,都是沒有經過Apple DRM保護, 可以直接進行反編譯

這章重點在於混淆,簡單介紹砸殼讓讀者了解大概是怎麼進行

準備測試專案

簡單的專案如下,除了套件以外,就只有一個初始 ViewController

├── AppSecDev
│   ├── AppDelegate.swift
│   ├── Assets.xcassets
│   ├── Base.lproj
│   ├── Info.plist
│   ├── SceneDelegate.swift
│   └── ViewController.swift
├── AppSecDev.xcodeproj
├── AppSecDev.xcworkspace
├── Podfile
└── Pods

截圖 2020-10-15 上午12.13.55

尋找編譯後的 .app ,從 products 內直接使用右鍵從 Finder 尋找到編譯後二進位執行檔

截圖 2020-10-15 上午12.28.51

截圖 2020-10-15 上午12.30.25

AppSecDev.app 就是我們要找的編譯後二進位執行檔

Class-Dump

屬於靜態分析的一種,將公開類別名及方法 dump 出來

使用工具 class-dump(Nygard)

在Terminal 執行

./class-dump -H APP路徑/APP名稱.app -o 匯出目標資料夾
class-dump -H .../DerivedData/AppSecDev-xxxxxx/Build/Products/Debug-iphonesimulator/AppSecDev.app -o ./out

Dump出的東西

截圖 2020-10-15 上午12.09.48

這是原始 ViewController 內定義的方法

截圖 2020-10-15 上午12.11.16

可以比對一下發現有點不一樣,原因是我使用的 class-dump 無法解析Swift 相關的東西,但objC 部分都沒什麼問題

因為對這個範例所需資料已經夠用

依照剛剛解析出來資料

可看出想要破解的資料應該是在 _TtC9AppSecDev14ViewController 裡面

後續可以用這個當做搜尋用的關鍵字

想要完整解析 swift 可以使用 dsdump

進行反編譯

反編譯需要具備很多專業知識,看懂組合語言是基本東,當然還有很多『美美角角』要知道

因此這邊就不詳細敘述怎麼反編譯

反編譯很多工具可以使用,目前列出最受歡迎的 IDA 、Hopper 和 NSA 開發的Ghidra

字串尋找

原始程式碼

截圖 2020-10-14 下午11.15.08

    func aes(){
        let aes_message = "aes_message 咩"
        let aes_key_HexString = "01234567890000000000000000000111"
        let keyArray = Array<UInt8>.init(hex: aes_key_HexString)
        if
            let aes = try? AES(key: keyArray, blockMode: ECB()) , // aes128
            let encrypted = try? aes.encrypt(aes_message.bytes) ,
            let EncData = encrypted.toBase64()
        {
            print(EncData)
        }
    }

搜尋反編譯資料

截圖 2020-10-14 下午11.14.05

找到我們在程式內進行加密的字串金鑰

認真在分析,還原程式也可知道使用什麼加密演算法

混淆

看了上面的反編譯流程,可以得知順序怎麼進行,因此可以這流程上做手腳

達到混淆有心人士的意圖,讓分析動作十分困難,讓他們覺得無利可圖,而放棄

混淆可分為這三大類

  • 字串混淆 (Obfuscated String)
  • 程式碼混淆 CodeObfuscation
  • 程式碼邏輯混淆(Obfuscator)

字串混淆 (Obfuscated String)

字串在反編譯中算是最沒有難度,因為工具有一區就是記載全部的字串,可以慢慢在裡面找

如果字串包含很大的識別程度,很快就會被找到,像是Android 指定 加密模式是用字串

"AES/CBC/PKCS5Padding"

所以我們可以在字串上面作手腳

串接,字串雖然會複雜一點,但還是很快可以組出來因此就不討論

通常是用字串上做位元運換,或其他方式轉換,因此加密也是一種方式

加密前

image-20201015012146714

image-20201015012159499

image-20201015012221242

詳細運作方式及原理可以參考以下文章

https://blog.csdn.net/junzia/article/details/85466578

https://blog.csdn.net/jaccty/article/details/52471196

但原理大同小異,只是演算方式不同

也有人寫好的套件可以使用 ,https://github.com/UrbanApps/UAObfuscatedString

程式碼混淆 CodeObfuscation

大多數反組第一步都會先做靜態分析,從對應的class 結構來找尋有用的資料

所以要增加困難度,就是對 class name 、 method 進行混淆,使其造成閱讀困難,無法使用關鍵字搜索

image-20201015012929037

有些人會自己寫

也有些不錯的工具

https://github.com/CUITCHE/code-obfuscation for ObjC

https://github.com/rockbruno/swiftshield for Swift

程式碼邏輯混淆(Obfuscator)

為了讓反組譯的人更不容易找到資料,所以會針對指令修改,流程做的更複雜,讓人更不好破解

  • 控制流程扁平化

    • if-else語法,轉成do-while語法

    image-20201015013733726

  • 指令替换

    • 標準二元運算符(+ , – , & , | 和^)

      SDK API function 置換

      image-20201015013753544

  • 虚假控制流程

    • 多一堆垃圾程式碼

iOS 上有人又稱為 OLLVM (Obfuscator-LLVM),用這個關鍵字也可以找到很多前輩分享的作法

延伸閱讀 Android 混淆機制

程式碼混淆保護

但為了更加的安全,會採用加殼處理

自定義底層保護

逆向工具

免費

  • dsdump 支援Objective-C和Swift。支持Swift 5+

  • 命令工具,用於檢查Mach-O(Mach object)主要針對 Objective-C classes, categories, and protocols

  • class-dump-z 可使class-dump-z速度比其前任快近10倍。

Ghidra是由NSA研究部開發的一套軟件逆向工程(SRE)工具

付費&有限制免費使用

  • IDA Pro 可以處理iOS二進製文件。有內建 iOS Debuger。UI 操作很棒,但很貴,很多不錯的功能都是另外買。
  • Hopper 用於macOS和Linux的逆向工具,用於disassemble, decompile 。

參考資料

https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06c-Reverse-Engineering-and-Tampering.md

https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06b-Basic-Security-Testing.md#acquiring-the-app-binary


上一篇
Day 29. 手機螢幕截圖安全性問題,小心被看光光
下一篇
Day 31. 你以為結束了嗎? 錯了!今天要來回顧整個系列
系列文
看完眼眶濕濕的App開發者慘烈對抗險惡資安環境血與淚的控訴!31

2 則留言

0
ytyubox
iT邦新手 5 級 ‧ 2020-10-15 18:46:26

恭喜完賽~
這個系列我要來年再來閱讀,到時候用留言繼續讚美XD

羊小咩 iT邦新手 5 級 ‧ 2020-10-16 00:03:41 檢舉

感謝大大,恭喜大大也完賽了

(此回應已被刪除)

0
MarkFly~
iT邦新手 5 級 ‧ 2020-10-16 12:42:07

完賽了/images/emoticon/emoticon08.gif/images/emoticon/emoticon08.gif/images/emoticon/emoticon08.gif
讚啦(y)(y)(y)

羊小咩 iT邦新手 5 級 ‧ 2020-10-20 23:47:02 檢舉

我沒有死~~~~~~

https://ithelp.ithome.com.tw/upload/images/20201021/20117052K2F8jcmCs9.png

我要留言

立即登入留言