標籤:alictf android so 調試
通過做題來學習android逆向是一個比較不錯的方法。
雖然有投機取巧的方法解決這題,但是對這個題目的深入研究,學習到了dex的動態調試、破解加固等技術。
要感謝各位android大牛對此題的詳細介紹。我只是照著做了一遍,對有些不明確的地方自己演練了一下,並對android的so調試進行了一下簡單的歸納。
從零開始進行android的so代碼調試:
一、工具準備:
jre——java runtime enveroment //下面的一切工具都要這個支援
jdk——java development kits //需要用到裡面的jdb程式
Android SDK Manager //包括adb、ddms等各種工具,及各種SDK版本下載管理
Android AVD Manager //用來建立各種SDK版本和相應API層級的android虛擬機器
為了方便,將包含以上各種工具 + 生產力的目錄如sdk\platform-tools,sdk\tools等路徑加入Path環境變數。
建立一個虛擬機器:見我的前一篇文章
我使用的是SDK 4.0.3、API level 15。
安裝apk:adb install 3.apk
二、調試
這個還是參考大牛的文章。我這裡只把我參照大牛文章後自己做的貼出來。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/58/EA/wKiom1TAmG3RxlswAADncwrp7y4115.jpg" style="float:none;" title="1.png" alt="wKiom1TAmG3RxlswAADncwrp7y4115.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/58/E8/wKioL1TAmUSyyqI5AADCjMtrkHY925.jpg" style="float:none;" title="2.png" alt="wKioL1TAmUSyyqI5AADCjMtrkHY925.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/58/EA/wKiom1TAmG2zTvUAAAB2RE6Zrxw480.jpg" style="float:none;" title="3.png" alt="wKiom1TAmG2zTvUAAAB2RE6Zrxw480.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/58/E8/wKioL1TAmUWjWCjyAArrW7dRd58979.jpg" style="width:700px;height:419px;" title="4.png" width="700" height="419" border="0" hspace="0" vspace="0" alt="wKioL1TAmUWjWCjyAArrW7dRd58979.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/58/EA/wKiom1TAmG6QiX3GAAIX8S10sCA805.jpg" style="float:none;" title="5.png" alt="wKiom1TAmG6QiX3GAAIX8S10sCA805.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/58/E8/wKioL1TAmUXxsRhlAAI9YOQRyrk117.jpg" style="width:700px;height:200px;" title="6.png" width="700" height="200" border="0" hspace="0" vspace="0" alt="wKioL1TAmUXxsRhlAAI9YOQRyrk117.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/58/EA/wKiom1TAmG7DRHX0AAOeXcEYs8M922.jpg" style="width:700px;height:256px;" title="7.png" width="700" height="256" border="0" hspace="0" vspace="0" alt="wKiom1TAmG7DRHX0AAOeXcEYs8M922.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/58/E8/wKioL1TAmUWSeVQzAAFrCGWrRy4504.jpg" style="float:none;" title="8.png" alt="wKioL1TAmUWSeVQzAAFrCGWrRy4504.jpg" />
三、分析
因為不會使用idc指令碼,所以我的dump記憶體方法是利用Edit菜單,匯出rawdata。(看來是要好好學習一下IDA的進階功能了)
匯出的dex,使用dex2jar轉換成jar包,jd-gui查看,沒有看到完整的內容。
使用dexdecompile完整反編譯出了具體的內容。這個有可能是dump出的是odex格式的,dex2jar可能只支援dex格式。
直接找addJavascriptInterface函數,發現其匯出的介面對象名是加密的。
當然就這個題目來說,介面對象名可以使用wooyun的那個連結來枚舉出來,或者再次利用上面的方法調試出來。或者根本不用管直接找Toast.MakeText函數裡面的參數,就是答案了。(見)
作為一個喜歡刨根問底的人,自然那個translate.so和decrypt_native函數也要研究一番。一方面是強化一下so的調試技術,另一個方面是鍛煉一下ARM指令集的逆向能力。
最後感謝共用IDA6.6的大牛,全國人民的逆向水平又可以上一個新台階了。
本文出自 “萬物皆芻狗” 部落格,請務必保留此出處http://cugou.blog.51cto.com/9637775/1607005
阿里ctf-2014 android 第三題——so動態調試及破解加固