1. 程式人生 > >2015阿里&看雪移動安全挑戰賽-第二題

2015阿里&看雪移動安全挑戰賽-第二題

2015阿里&看雪移動安全挑戰賽-第二題
題目傳送門:AliCrackme
網上已經有很多writeup,我也是按照烏雲上的2015移動安全挑戰賽(阿里&看雪主辦)全程回顧的基本思路來想的。但作為一個新手,就算照著教程來做也會踩到很多坑。所以我想把自己解題過程中遇到的一些細節問題跟大家分享一下。
文章中提到的環境配置是按照看雪論壇非蟲的《Android軟體安全與逆向分析》配置的,這本書很棒,講的很詳細。在這裡安利一波。

0x01

app安裝完後長這樣:
主介面
輸入錯誤的密碼會提示校驗碼錯誤。我們先看看這次日誌會不會有什麼輸出。
LogCat
可以發現,每次輸入密碼提交後,日誌總會輸出 SecurityCheck Started...

,結合上一題的經歷,我們能夠從程式碼中發現日誌輸出語句。
那麼我們就來看看從jar檔案中能夠發現什麼。

0x02

jar
從程式碼中可以看到,校驗成功與否是由securityCheck()這一方法的返回值決定的。而在它的Java程式碼中,我沒有找到這一方法,也沒有找到日誌輸出的語句。後來看烏雲上的資料,在反編譯後的lib資料夾下找到了libcrackme.so檔案。根據提示,用IDA打開了這個檔案。
(注:某些版本的IDA不支援除錯so檔案,這裡我用的是6.6版本)
IDA
發現了securityCheck()方法,繼續往下找,我們在0x1284處發現了日誌輸出函式android_log_print


log_print

0x03

那麼,securityCheck的執行流程是怎樣的?從烏雲上的文章解釋得很詳細:

在securityCheck這個方法呼叫前,在init_array段和JNI_Onload函式里程序都做了些處理,而在securityCheck方法的最後有一個判斷,將使用者輸入和wojiushidaan做比較。嘗試直接輸入wojiushidaan,發現密碼錯誤,因此可以猜測前面一大段邏輯的作用就是會把這個最終的字串改掉。此時的思路是隻需知道最終判斷時候這個wojiushidaan地址上的變換後的值就行了。嘗試使用IDA除錯發現一旦attach上去,整個程式就退出,想必一定是在之前的程式碼中有反除錯的程式碼。

既然我們要得到變換後的值,我們就可以藉助日誌輸出函式將我們想要得到的值輸出出來就好了,因此,我們需要對so檔案進行一下修改。
- 將從0x1284到0x129C處都用NOP改寫(NOP為空操作)
- 在0x12AC處呼叫android_log_print函式
- 為了不影響R1的值,把0x12A0處的R1改成R3
- 將0x12A4處的R1改成R3
- 將0x12A8處指令改成MOV R0,#4

因為so為二進位制檔案,所以我們修改的也是二進位制。
- NOP對應的二進位制值為00 00 A0 E1
- android_log_print對應的二進位制值為88 FF FF EB
- 0x12A0處的值應改為60 30 9F E5
- 0x12A4處的值應改為07 20 93 E7
- MOV R0,#4的值為04 00 A0 E3

在IDA中,選中某一行,進入Hex View選項卡就可以看到該行的二進位制數值。按下F2鍵可以進行編輯,編輯好後再按下F2鍵可以進行儲存。此時回到IDA View介面就可以看到程式已經改好了。但注意,IDA中的修改只是儲存在了它自己的資料庫裡,並沒有儲存到so檔案裡。所以為了能夠直接編輯so檔案,我們可以使用UltraEdit來進行編輯。在IDA中確認無誤後可將修改內容通過UE儲存。
改之前程式碼:
IDA
改之後程式碼:
IDA

0x04

so檔案修改完儲存好後,將它與原來的反編譯檔案一起重新打包簽名,生成一個新apk。然後將apk重新安裝到虛擬機器上。執行後觀察輸出日誌。
LogCat
可以發現,日誌輸出了一個字串aiyou,bucuoo,經驗證,該字串為正確的密碼。
成功