Android逆向 -- 內存Dump法(初代殼)


 

 

 

▼更多精彩推薦,請關注我們

通過一道CTF題,來初步掌握手脫一代殼-內存Dump法

 

快來跟布布解鎖新姿勢吧。

 

內存Dump法

題目來自: 2014 alictf APK第三題

 

首先拿到APK,查殼。

image.png

發現加殼了,想到是多年前的題,用的肯定是多年前的殼,故也因為是一道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目錄下的

image.png這個文件夾里面的一個名為 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 來啟動文件,啟動完成之后。image.png

(筆者已經運行了,故提示已經運行)

另外打開一個控制台,輸入以下代碼進行進行端口轉發

adb forward tcp:23946 tcp:23946  (注意,空格,冒號不能缺)

image.png

到此,IDA可以對手機進行附加調試了。

 

 

打開IDA把上面得到的SO文件拖入其中打開。(使用32位的IDA加載)

在菜單欄中選擇:Debuggable -->select Debuggable 

image.png

選擇后出現如上圖,選擇第二個,然后點擊OK。

然后我們

 

接下來,我們再次打開IDA在菜單欄中:Debuggable-->debuggable options 打開,勾上如圖所示

image.png

再次點擊OK。

我們再次點開:Debuggable --> Process options 輸入如圖image.png 或者把localhost改為127.0.0.1。上方那些不用理會。保持默認即可。點擊OK。繼續下一步操作。

重新打開控制台。輸入以下代碼

adb shell am start -D -n com.ali.tg.testapp/.MainActivity

使進入可調式狀態。

image.png

image.png

手機會如上圖所示,不要理會。我們繼續。

我們先找到dvmDexFileOpenPartial函數在so文件中的相對地址。在左邊框框按ctrl+f 然后搜索函數名。雙擊,右邊就會跳轉。可見其相對地址為 0x00043CFC

image.png

 

 

再次點擊Debuggable -->attach to process

來附加進程。我們找到我們的進程。如圖

image.png

雙擊它即可附加成功。

進入一個調試頁面。我們按 ctrl+s 搜索 libdvm

image.png

 

可見為0x414A900(后兩者重新加載了,忽略)

我們相加,就是函數的絕對地址:0x00043CFC+0x414A9000=0x414ECCFC

image.png

我們在IDA中按 G鍵 輸入上方的結果跳轉即為該函數所在。

image.png

image.png

 

 

 

這時方法一,還有一種方法更加簡單。直接在右方module處找到,libdvm.so。雙擊。出現如圖,在按ctrl+f搜索

dvmDexFileOpenPartial

image.png

 

 

搜索后會出現image.png

出現了一個函數,雙擊進入。發現進入后與我們上一種方法進入的地方一樣。而且細致的你也發現了。

他給出的地址與我們上面算出來的絕對地址一樣image.png

在該函數入口按F2設下斷點

然后按F9運行。

接下來我們需要打開一個控制台使用jdb命令啟動連接attach調試器。命令如下

image.png

port處的端口號可以使用DDMS查詢

image.png

回到ida,我們再次按F9運行(現在已經按兩次了)然后等到程序運行到斷點處。

image.png

image.png選擇R0寄存器。你就能看到如圖所示了。這里有個特征字符串dex.035。而我們找到了dex在內存中的基地址,那我們怎么知道文件有都大呢?其實很簡單,通過int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)這個函數我們可以知道,第一個參數是dex的基地址。第二個參數就是文件的大小了。而在寄存器中。R0-R4是儲存函數的值。所以r0就是dex文件的基地址。r1就是文件的大小。

image.png

接下來我們打開腳本窗口編寫腳本即可,腳本如下

image.png

你也可以算出具體的地址值帶入進去,如下

image.png

然后點擊OK,出現如下。請耐心等待,。別點擊Cancel。已經在開始dump了。

 

image.png

結果image.png

用jadx-gui打開。image.png

成功。

接下來的分析就不是我們要講的了。

結束。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM