<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Android 逆向 apkrev

    VSole2021-09-27 16:16:28

    題目鏈接:https://buuoj.cn/match/matches/28/challenges#apkrev

    下載后解壓可得一個名為 apkrev 的 apk 文件,扔到模擬器里運行。

    包含一個輸入框和一個按鈕,隨便輸入123,Toast 顯示 fail。使用 jeb 打開。

    在 MainActivity 上右鍵反編譯。

    可以看到,調用了 so 文件中的檢驗函數 myCheck(),參數為輸入的字符串。

    IDA 分析 so 文件

    把 so 文件(x86)扔進 IDA,并在函數窗口搜索 myCheck 函數,雙擊跳轉,F5,從返回開始看起:

    返回值 v28 只在 136 行被賦值為 1,其余均為 0;

    顯然,132 行的 while 循環是在比較輸入字符串經過一系列處理后是否與密文 enc 相同。v27 從 0 開始自增,直至大于 0x1F(即 31)時,循環結束。

    先查看 enc:

    用腳本將 enc 復制出來。在 IDA 中按快捷鍵 Shift + F2:

    python 源碼:

    from idaapi import *bytes_addr = 0x00033004bytes_size = 32data = get_bytes(bytes_addr,bytes_size)L = [hex(ch) for ch in data]print (L)# 真密文# ['0x8c', '0xc4', '0x0', '0xe6', '0x6a', '0x88', '0xb8', '0x90', '0xc2', '0x7', '0x6b', '0xa9', '0xc3', '0xa', '0x3e', '0xc0', '0x44', '0xa6', '0xfe', '0x7e', '0xf0', '0x59', '0x4c', '0x83', '0x3d', '0x2b', '0xe2', '0xd3', '0x38', '0xcb', '0x82', '0x5b']
    

    繼續分析代碼可以看出,輸入字符串長度應為 32,且只在此處進行了異或操作:

    于是考慮動態調試 so 文件,思路參考 [1],調試方法參考 [2] 和 [3]。

    思路:輸入錯誤的 flag,得到假密文,將錯誤的 flag 、假密文、真密文進行異或,即可得到真 flag。

    動態調試

    1、使用雷電模擬器,首先確定模擬器的安卓版本,安裝 device info hw.apk ( https://www.cr173.com/soft/845060.html )查看相關信息: 

    平臺為 android_x86,所以選擇 IDA/dbgsrv 目錄下的 android_x86_server 文件,使用 adb push 命令傳輸到模擬器,在添加可執行權限后運行。

    2、新建 cmd 窗口,命令如下:

    D:\IDA Pro\IDA Pro 7.5\dbgsrv>adb push android_x86_serveradb.exe: push requires an argument D:\IDA Pro\IDA Pro 7.5\dbgsrv>adb push android_x86_server /data/local/tmpandroid_x86_server: 1 file pushed, 0 skipped. 30.5 MB/s (1130104 bytes in 0.035s) D:\IDA Pro\IDA Pro 7.5\dbgsrv>adb shellaosp:/ # suaosp:/ # cd /data/local/tmpaosp:/data/local/tmp # lltotal 1104-rw-rw-rw- 1 root root 1130104 2020-12-11 22:18 android_x86_serveraosp:/data/local/tmp # chmod 777 android_x86_serveraosp:/data/local/tmp # ./android_x86_serverIDA Android x86 32-bit remote debug server(ST) v7.5.26. Hex-Rays (c) 2004-2020Listening on 0.0.0.0:23946...
    

    3、再建一個 cmd 命令行窗口,使用 forward 程序進行端口轉發:

    C:\Users\admin>adb forward tcp:23946 tcp:2394623946 C:\Users\admin>adb forward --listemulator-5554 tcp:23946 tcp:23946
    

    4、打開 IDA,選擇菜單 Debugger -> Attach -> Remote Linux debugger;

    Hostname 設置為 127.0.0.1,OK;

    選擇要附加的進程,找到 com.example.re,OK;

    進入調試界面后,在右側 Modules 窗口搜索需要調試的庫:libnative-test.so;

    雙擊,跳轉到對應的 so 庫,即可看到 so 庫里的方法,搜索方法:myCheck();

    雙擊函數名,跳轉到對應的函數代碼,F5,與靜態分析看到的 myCheck 方法相同;

    在比較處下斷:

    5、開始調試:

    注意,要求輸入字符串長度為 32,因此輸入:flag{11111111111111111111111111};

    程序在斷點處停下,先查看 enc:

    再查看 v38(在棧上):

    通過 python 腳本復制:

    from idaapi import *bytes_addr = 0xCFFFD6F8bytes_size = 32data = get_bytes(bytes_addr,bytes_size)L = [hex(ch) for ch in data]print (L)# 假密文#['0xdd', '0x9f', '0x58', '0xb3', '0x72', '0x80', '0xef', '0x96', '0xc1', '0x2', '0x3b', '0xfe', '0x97', '0xc', '0x39', '0x94', '0x43', '0xaf', '0xac', '0x78', '0xf8', '0x59', '0x4c', '0x84', '0x68', '0x2a', '0xe4', '0x86', '0x68', '0x9c', '0xd2', '0x13']
    

    6、至此,可通過腳本計算出 flag:

    enc = [0x8C, 0x0C4, 0x0, 0x0E6, 0x6A, 0x88, 0x0B8, 0x90, 0x0C2, 0x7, 0x6B, 0x0A9, 0x0C3, 0x0A, 0x3E, 0x0C0, 0x44, 0x0A6, 0x0FE, 0x7E, 0x0F0, 0x59, 0x4C, 0x83, 0x3D, 0x2B, 0x0E2, 0x0D3, 0x38, 0x0CB, 0x82, 0x5B] fake_flag = "flag{11111111111111111111111111}" fake_flag_cipher = [0xdd, 0x9f, 0x58, 0xb3, 0x72, 0x80, 0xef, 0x96, 0xc1, 0x2, 0x3b, 0xfe, 0x97, 0xc, 0x39, 0x94, 0x43, 0xaf, 0xac, 0x78, 0xf8, 0x59, 0x4c, 0x84, 0x68, 0x2a, 0xe4, 0x86, 0x68, 0x9c, 0xd2, 0x13] for i in range(32):    print(chr(ord(fake_flag[i])^fake_flag_cipher[i]^enc[i]), end='')# 7792c9f724afe76e68c79116d07dafa5
    

    7、提交驗證:

    over!

    dataida
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    源碼分析1、LLVM編譯器簡介LLVM 命名最早源自于底層虛擬機的縮寫,由于命名帶來的混亂,LLVM就是該項目的全稱。LLVM 核心庫提供了與編譯器相關的支持,可以作為多種語言編譯器的后臺來使用。自那時以來,已經成長為LLVM的主干項目,由不同的子項目組成,其中許多是正在生產中使用的各種 商業和開源的項目,以及被廣泛用于學術研究。
    可以看到有兩個printf函數打印了一些數據出來,我們點第一個打印的字符串。
    STL容器逆向與實戰
    2023-02-08 09:53:04
    當然可能還存在許許多多的STL容器,但是大體的分析思路是類似的。
    安卓加固脫殼分享
    2023-04-03 10:04:45
    smali不熟悉的話,可以反編譯dex再轉jar 直接用java gui看java代碼。首先啟動ida server 為了防止被檢測到,最好將 android_server 改一個名字。執行此命令后,手機上會提示 Walting For Debugger 字樣。因為我們是以調試方式啟動,所以 apk 在運行后 PC會在第一條指令處等待?因為我們要看他加載哪個so來解密so和dex文件。所以要勾選加載LIB時中斷。如果是多個so解密dex,這樣我們還能觀察幾個解密so的加載順序。選擇相應的包名。等待狀態,這時?需要使用 JDB喚醒進程。
    target_func: sark.Function 類型,表示要查找交叉引用關系的目標函數對象。max_depth: int 類型,表示查找引用關系的最大深度。② 然后根據 include_data_xref 的設置,獲取該函數中所有的引用 refes。③ 遍歷函數的所有引用 ref,如果該引用 ref 指向目標函數,則在有向圖 G 中通過 add_edge 函數添加一條從當前函數到目標函數的邊,并返回 True。④ 如果引用指向另一個函數,則遞歸調用 find_cross_refs 函數查找兩個函數之間的交叉引用關系。⑤ 如果所有引用遍歷完,仍然沒有找到交叉引用,則返回 False。
    IDA Pro是反匯編程序 反匯編程序用于將機器代碼轉換為人類可讀的格式,稱為匯編語言。我們每天使用的軟件的源代碼并不總是可用。像IDA Pro這樣的反匯編程序能夠創建其執行的映射,以顯示處理器實際以稱為匯編語言的...
    近期接著之前的進度終于啃完了這一章,這里給大家繼續同步K A, Monnappa.《Forensic Learning Malware Analysis》精要翻譯,以及翻譯過程中的一些小實踐記錄。
    1背景最近有統計覆蓋率信息的需求,多方搜索后發現IDA插件Lighthouse具有統計覆蓋率的功能,通過讀取DynamoRIO或者Pin產生的覆蓋率日志文件,在IDA中以圖形化形式展現代碼的詳細執行路徑。
    巧解一道CTF Android題
    2022-08-10 16:15:40
    無須還原代碼,窮舉爆破。我們打開jeb工具,定位到當前activity。我們看一下saveSN方法,可以看到這是一個native方法。我們解包一下apk,獲取到so文件。下面進入ida分析。導出函數并沒有相關java的native方法,說明是動態注冊。我們看下JNI_ONLOAD函數:jint JNI_OnLoad{ if ( !
    EXP編寫學習之繞過GS
    2023-02-20 09:58:16
    棧中的守護天使 :GSGS原理向棧內壓入一個隨機的DWORD值,這個隨機數被稱為canary ,IDA稱為 Security Cookie。Security Cookie 放入 ebp前,并且data節中存放一個 Security Cookie的副本。棧中發生溢出時,Security Cookie首先被淹沒,之后才是ebp和返回地址。函數返回之前,會添加一個Security Cookie驗證操作,稱為Security Check。檢測到溢出時,系統將進入異常處理流程,函數不會正常返回,ret也不會被執行。函數使用無保護的關鍵字標記。緩沖區不是8字節類型 且 大小不大于4個字節。可以為函數強制啟用GS。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类