macOS逆向-如何分析macOS軟體
0x00 前言:
完事開頭難。許多希望學習逆向工程的朋友通常在網上翻看了許多相關的部落格和教程之後仍會覺得無從下手,《macOS軟體安全與逆向分析》上的第一章將會帶我們從頭開始搭建一個最簡單的分析環境,引導你自己動手寫一個簡單的CrackMe並破解它。
0x01 分析環境搭建:
首先,我們需要一個編譯器來編譯程式碼, 目前在macOS系統上最流行的編譯器自然是鼎鼎大名的Clang。
安裝Clang
Clang是蘋果公司開源專案LLVM中的一部分,是屬於LLVM的一個前端,其中LLVM的官網為:http://www.llvm.org。
其實我們安裝過Xcode的話,就已經自帶了LLVM,你可以在命令列中執行clang -v檢視是否有安裝llvm。
假如,你還沒有安裝那麼請在AppStore
中安裝Xcode
即可。
安裝Radare2
關於HT Editor
我這裡和書本中的不同,書上寫著是讓你安裝HT Editor
,可是我實踐下來發現HT Editor一點都不好用,可能作者寫這本《macOS軟體安全與逆向分析》書本的時候,年代還比較久遠,可能那時候流行這個工具,反正結論就是HT Editor
不好用,而且有Bug不支援顯示中文。
什麼是Radare2
什麼是Radare2?
Radare2是一個命令列框架工具,他主要用於取證、逆向分析,他裡面包含了很多其他的命令列小工具。
比如他可以進行反彙編、動態除錯、Hash計算、Shellcode生成、檔案格式檢視、檔案比較、字串搜尋等等。
Radare2的手動安裝
radare2的官網是:https://www.radare.org/n/,官網上介紹的安裝方式是讓你從原始碼中構建。
git clone https://github.com/radareorg/radare2
cd radare2
sys/install.sh
#如果構建失敗
sudo make purge
rm -rf shlr/capstone
git clean -xdf
git reset --hard @~50
sys/install.sh
測試radare2是否安裝成功
Radare2 裝好後,執行radare2 -h
是否安裝成功。
0x02 第一個macOS程式
目前我們已經安裝好了編譯環境,也裝好了一個簡單逆向分析的環境,那麼接下來我們就要和CTF一樣,來寫一個簡單的Crackme來實踐了,原始碼非常簡單是用純C寫的檢測數字是否正確的程式。
#include <stdio.h>
int main()
{
int secret = 0;
printf("Please input the secret number:");
scanf("%d",&secret);
if(secret != 123)
{
printf("error secret number!\n");
return 0;
}
printf("Success!");
}
然後我們用clang crackme.c
來進行編譯,將程式編譯成MachO可執行檔案,程式執行後會提示你輸入一個數字,如果輸入的不是123就會提示你error secret number!
,輸入是123就會提示Success!
。
clang crackme.c -o crackme
➜ ./crackme
Please input the secret number:1
error secret number!
0x03 破解Crackme
我們需要來破解這Crackme,當我們輸入任何數的時候都顯示Success!
,所以我們需要將它邏輯修改掉。
這裡我們就用Radare2來演示,而切入點就是字串error secret number!
,然後根據字串再找到對應的判斷邏輯的彙編程式碼
,將彙編程式碼邏輯修改掉即可。具體Radare2的一些用法可以參考此篇文章:https://blog.csdn.net/qq_31507523/article/details/117200476
➜ r2 crackme
-- Are you still there?
[0x100003ed0]> aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Check for objc references (aao)
[x] Finding and parsing C++ vtables (avrr)
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information (aanr)
[x] Use -AA or aaaa to perform additional experimental analysis.
[0x100003ed0]> axt @@ str.* #這裡的命令就是列出crackme裡面的所有呼叫到的字串。
[0x100003ed0]> s 0x100003f2a #跳轉到呼叫Success這字串的地址這
[0x100003f2a]> pdf #檢視當前地址所在的彙編程式碼
從箭頭處我們可以看到,他是從je 0x100003f2a
,這一處彙編程式碼中跳過來的,他上面一句是cmp dword [var_8h],0x7b
,對應的意思是比較var_8中輸入的值是否等於123,如果是則跳轉到Success!
處,我們要破解的話就可以改成條件不成立也可以調過來即修改je 0x100003f2a -> jne 0x100003f2a
。
打補丁
OK現在我們知道修改哪個地方0x100003f0a
,修改成什麼彙編程式碼jne 0x100003f2a
,就能達到補丁的目的了,但是直接改彙編好像在IDA中用Keypatch
外掛可以實現,ps:(IDA後面會介紹,是一款很強大的反彙編、反編譯、靜態分析軟體),那麼目前我對radare2掌握還不是很熟悉,我目前只能通過修改OPCODE(機器碼)
的方式來達到打補丁的效果。
je->jne
je改成jne只需要將0x84
修改成0x85
即可,具體可以檢視https://asmjit.com/asmgrid/ 該網站對應指令的opcode。
用radare2修改
在radare2下要打補丁一個程式,用-w引數開啟程式即可。
➜ r2 -w crackme
-- When can we have an official anime mascot for radare2?
[0x100003ed0]>s 0x100003f0b #跳轉需要打補丁出的地址
[0x100003f0b]>px 10 #用十六進位制方式顯示當前地址 10個位元組資料
[0x100003f0b]>wx 85 #打補丁
修改前後對比:
0x04 驗證crackme
最後執行crackme來驗證下。
Pwn菜雞學習小分隊
歡迎來PWN菜雞小分隊閒聊:PWN、RE 或者摸魚小技巧。