▼更多精彩推薦,請關注我們
通過一道CTF題,來初步掌握手脫一代殼-內存Dump法
快來跟布布解鎖新姿勢吧。
內存Dump法
題目來自: 2014 alictf APK第三題
首先拿到APK,查殼。
發現加殼了,想到是多年前的題,用的肯定是多年前的殼,故也因為是一道CTF的題,不會在開始初步為難解題者,故判定是使用了我們現在所說的一代殼。(所謂的幾代,就是加固安全員與脫殼者之間的對抗,日益升級后的結果)
我們嘗試使用Dump法,也可寫hook脫殼,不過這是題外話了。下面我們開始操作吧。
使用的工具:
1:IDA pro 7.0
2: root真機(4.4)
3:APKtool BOX
4:DDMS
首先,我們需要得到libdvm.so這個文件。他在手機的 /system/lib/ 中。我們為什么要使用這個so文件呢?因為一個函數的絕對地址=函數在so文件中的相對地址+映射到內存的基地址,而底層加載很多DEX的函數都在這個文件里面。所以我們要得到這個so文件加載它。從而可以找到函數下斷點進行SO層的調試。
接下來我們講講怎么IDA附加調試(有基礎的可以略過)
我們需要先開啟IDA的調試功能。我們需要將IDA目錄下的
這個文件夾里面的一個名為 android-server的文件使用 adb指令 push導入到 手機中指令如下,
adb push (android-server文件的路徑)/data/local/tmp/
筆者認為,可以對其改名,筆者已將其改名為as。
這樣方便我們以后在開啟的時候方便快捷。導入之后。使用如下代碼添加權限,注意,要進入文件所在目錄進行對文件權限提升。可用以下代碼在控制台輸入
adb shell
su
cd /data/local/tmp
chmod 777 android-server
(筆者已經運行了,故提示已經運行)
完成后,繼續輸入 ./android-server 來啟動文件,啟動完成之后。
(筆者已經運行了,故提示已經運行)
另外打開一個控制台,輸入以下代碼進行進行端口轉發
adb forward tcp:23946 tcp:23946 (注意,空格,冒號不能缺)
到此,IDA可以對手機進行附加調試了。
打開IDA把上面得到的SO文件拖入其中打開。(使用32位的IDA加載)
在菜單欄中選擇:Debuggable -->select Debuggable
選擇后出現如上圖,選擇第二個,然后點擊OK。
然后我們
接下來,我們再次打開IDA在菜單欄中:Debuggable-->debuggable options 打開,勾上如圖所示
再次點擊OK。
我們再次點開:Debuggable --> Process options 輸入如圖 或者把localhost改為127.0.0.1。上方那些不用理會。保持默認即可。點擊OK。繼續下一步操作。
重新打開控制台。輸入以下代碼
adb shell am start -D -n com.ali.tg.testapp/.MainActivity
使進入可調式狀態。
手機會如上圖所示,不要理會。我們繼續。
我們先找到dvmDexFileOpenPartial函數在so文件中的相對地址。在左邊框框按ctrl+f 然后搜索函數名。雙擊,右邊就會跳轉。可見其相對地址為 0x00043CFC
再次點擊Debuggable -->attach to process
來附加進程。我們找到我們的進程。如圖
雙擊它即可附加成功。
進入一個調試頁面。我們按 ctrl+s 搜索 libdvm
可見為0x414A900(后兩者重新加載了,忽略)
我們相加,就是函數的絕對地址:0x00043CFC+0x414A9000=0x414ECCFC
我們在IDA中按 G鍵 輸入上方的結果跳轉即為該函數所在。
這時方法一,還有一種方法更加簡單。直接在右方module處找到,libdvm.so。雙擊。出現如圖,在按ctrl+f搜索
dvmDexFileOpenPartial
搜索后會出現
出現了一個函數,雙擊進入。發現進入后與我們上一種方法進入的地方一樣。而且細致的你也發現了。
他給出的地址與我們上面算出來的絕對地址一樣
在該函數入口按F2設下斷點
然后按F9運行。
接下來我們需要打開一個控制台使用jdb命令啟動連接attach調試器。命令如下
port處的端口號可以使用DDMS查詢
回到ida,我們再次按F9運行(現在已經按兩次了)然后等到程序運行到斷點處。
選擇R0寄存器。你就能看到如圖所示了。這里有個特征字符串dex.035。而我們找到了dex在內存中的基地址,那我們怎么知道文件有都大呢?其實很簡單,通過int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)這個函數我們可以知道,第一個參數是dex的基地址。第二個參數就是文件的大小了。而在寄存器中。R0-R4是儲存函數的值。所以r0就是dex文件的基地址。r1就是文件的大小。
接下來我們打開腳本窗口編寫腳本即可,腳本如下
你也可以算出具體的地址值帶入進去,如下
然后點擊OK,出現如下。請耐心等待,。別點擊Cancel。已經在開始dump了。
結果
用jadx-gui打開。
成功。
接下來的分析就不是我們要講的了。
結束。