您的位置:首頁>正文

iOS內核調試教程

步驟1:使用說明

1.你要具備一個可以設置啟動參數的iOS設備, 或下載一個內核修補程式來啟用調試。 請注意, 在本文的說明中, 我會以iPhone 4為例進行演示, 這樣我就可以在使用RedSn0w工具時設置引導參數。

3. 帶有XCode的GDB將會非常有利於你的調試。

4.確保serialKDPproxy已安裝, 用於內核調試的協定通常用於不是串列的UDP通訊端, 所以你需要使用一個工具來代替它。 幸運的是, 有人對該工具進行了編譯。

步驟2:破解設備並設置引導參數

iOS內核不能被直接調試, 這是因為蘋果公司的工程師不想讓攻擊者輕易發起攻擊。 所以為了達到調試的目的, 我必須先破解設備, 才能夠設置正確的啟動參數並應用相應的內核補丁。

關於如何使用RedSn0w破解iOS設備, 請點此連結, 此處略去不表,

但我要提醒的是, 在使用該工具時一定要添加適當的啟動參數。 你可以通過Extras -> Even More -> Preferences -> Boot Args進行設置。 在文字方塊中, 你應該輸入以下字串“debug = 0x8f -v wdt = 0”。 這些參數為了告訴你內核啟動的方式:

1.在調試模式中使用特殊標誌引導;

2.在詳細模式下啟動;

3.啟動監視器的計時暫停功能, 這樣可以暫停執行過程, 以免被發現。

這樣設備將在停止啟動, 直到你添加一個調試器。

步驟3:使用SerialKDPproxy

現在該設備暫停, 直到添加了調試器, 為此我需要啟動serialKDPproxy。 ./SerialKDPProxy的用法很簡單, 舉個例子, 在我的設備中就是./SerialKDPProxy /dev/tty.usbserial-AH00NR2W。 在此之後, 我就可以看到從設備輸出到控制台的各種調試消息。

你也可以在設備啟動之前運行這個程式, 並且會有大量的輸出, 這將有助於告訴你設備啟動時真正發生了什麼。 例如, 顯示的內核滑動(kernel slide), 會説明你確定函數位址。

步驟4:使用GDB 連接到內核

使用serialKDPproxy就可以非常輕鬆地連接到內核。首先,你需要使用gdb -arch armv7命令啟動gdb。這說明gdb將調試iOS設備,而不是具有i386體系結構的OS X應用程式。在gdb提示符之後,你需要執行的所有操作都是輸入target remote-kdp,然後附加localhost。這時,你應該能得到一個回應,說你已經連接上了內核。如果你不能確保將正確的引入引導參數,那就將serialKDPproxy附加到正確的設備上。

另一種方法是,如果你有一個符號化的內核緩存,你可以在開始gdb時將它添加到參數中。然後,它將在連接時將這些符號添加到內核進程中,並允許你通過它們的名稱而不是僅僅通過位址來引用函數。

步驟5:基本調試功能

現在你基本上擁有了gdb通常擁有的所有功能,這意味著你可以使用命令p *(int *)位址來獲取記憶體位址,也可以使用set {int} = val來設置內容。你也可以使用x / i addr或反彙編功能反彙編代碼,你也可以使用命令寄存器查看所有寄存器。中斷點也可以由命令break *(addr)來設置,以上這些都是標準的gdb命令。

這些gdb命令的功能非常強大。有很多情況下,這可以大大縮短你逆向工程的時間。有時一分鐘的調試可能相當於你二進位靜態分析的幾個小時。

步驟6:設置一個中斷點

假設你正在分析一個漏洞的OSUnserializeXML函數,如果你想知道它在特定的時間調用堆疊的過程,你就可以使用靜態分析來查看像IDA Pro這樣的程式中的內核程式集,或者你可以簡單地在IDA中找到OSUnserializeXML函數的位址,並將其添加到在啟動時列印到串列控制台的內核滑動中,以查找函數的真真實位址,然後在那裡設置一個中斷點。然後當它被調用時,執行就會停止,此時你將通過完整的控制來分析正在發生的進程。

使用serialKDPproxy就可以非常輕鬆地連接到內核。首先,你需要使用gdb -arch armv7命令啟動gdb。這說明gdb將調試iOS設備,而不是具有i386體系結構的OS X應用程式。在gdb提示符之後,你需要執行的所有操作都是輸入target remote-kdp,然後附加localhost。這時,你應該能得到一個回應,說你已經連接上了內核。如果你不能確保將正確的引入引導參數,那就將serialKDPproxy附加到正確的設備上。

另一種方法是,如果你有一個符號化的內核緩存,你可以在開始gdb時將它添加到參數中。然後,它將在連接時將這些符號添加到內核進程中,並允許你通過它們的名稱而不是僅僅通過位址來引用函數。

步驟5:基本調試功能

現在你基本上擁有了gdb通常擁有的所有功能,這意味著你可以使用命令p *(int *)位址來獲取記憶體位址,也可以使用set {int} = val來設置內容。你也可以使用x / i addr或反彙編功能反彙編代碼,你也可以使用命令寄存器查看所有寄存器。中斷點也可以由命令break *(addr)來設置,以上這些都是標準的gdb命令。

這些gdb命令的功能非常強大。有很多情況下,這可以大大縮短你逆向工程的時間。有時一分鐘的調試可能相當於你二進位靜態分析的幾個小時。

步驟6:設置一個中斷點

假設你正在分析一個漏洞的OSUnserializeXML函數,如果你想知道它在特定的時間調用堆疊的過程,你就可以使用靜態分析來查看像IDA Pro這樣的程式中的內核程式集,或者你可以簡單地在IDA中找到OSUnserializeXML函數的位址,並將其添加到在啟動時列印到串列控制台的內核滑動中,以查找函數的真真實位址,然後在那裡設置一個中斷點。然後當它被調用時,執行就會停止,此時你將通過完整的控制來分析正在發生的進程。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示