iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
Security

資訊安全的美味雜炊系列 第 18

[Day18] - Rev 0x3 Android

  • 分享至 

  • xImage
  •  

Day18 - Rev 0x3 Android

前言

  • 今天來談談Java與Android逆向,介紹一下工具以及幾題關於Android逆向的簡單CTF題目,練習一下如何patch和理解程式邏輯

你的手機安全嗎?

應用程式來源

  • Play 商店
  • 奇怪的 store
  • APK(android的應用程式安裝檔)

OWASP Moblie Top-10

逆向App的目的

  • 了解整個 app 的邏輯以及行為
  • 拿到所需的資訊,或許能看到 API?
    • e.g. 知道 API ,針對 API 進行攻擊
  • 修改編輯、打包
    • e.g. 繞過廣告、升級付費會員

怎麼逆呢?

  • 我們來分析apk的安裝檔案

  • 我們試著拿解壓縮工具(e.x 7-zip)將apk,看看裡面有甚麼檔案,發現大概的架構如下

  • 我們對配置文件下手,但似乎看不懂,裡面是binary

Apktool 拆包/打包

  • 能夠把 apk 拆包,打包的工具

  • apktool

    • 請參考其教學安裝
  • 拆包

    • apktool d <file.apk> -o <dir>
  • 打包

    • apktool b <dir> -o <*.apk>

我打包成功了,阿怎麼裝失敗

Apk Sign

  • apk要執行的時候,會檢查應用程式有沒有Sign過,確保應用程式有被驗證過
# 生出一把key
keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
# 對apk簽名
jarsigner -verbose -keystore demo.keystore <your_apk> demo.keystore

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.helloworld">
    <application android:allowBackup="true" android:debuggable="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name">
        <activity android:label="@string/app_name" android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>
  • activity 描述app使用介面
  • intent-filter 配置
  • action 動作 (程式入口點)
  • category 分類
    • 是應用程式中最優先被執行的Activity

META-INF

  • 目的:安裝 app 時做檢查跟校驗
  • 用 private key 加密
  • MANIFEST.MF
    • apk 中的文件,都會有 hash 對應到文件
  • CERT.SF
    • 第二道防線,對前一步的每一條內容在 hash( sha1 ) 接著進行 base64
  • CERT.RSA
    • 存了 public key 及加密算法

JVM

  • java sourcecode => java bytecode
  • 接著轉成 machine language ,在 JVM 上執行
    • 跨平台 windows, linux, MacOS...

Dalvik Virtual Machine

  • 由 Dan Bornstein 編寫
  • 適合記憶體和處理器速度有限的系統

Smali

  • 把 .dex 的 bytecode ,轉成人類可讀的語言
  • 透過 smali ,可以將程式邏輯進行竄改
    B --- byte
    C --- char
    D --- double
    F --- float
    I --- int
    J --- long
    S --- short
    V --- void
    Z --- boolean
    [XXX --- array
    Lxxx/yyy --- object
    

Smali與Dalvik Byte關係

Example

  • foo ()V => void foo()
  • foo (III)Z => boolean foo(int, int, int)
  • foo (Z[I[ILjava/lang/String;J)Ljava/lang/String => String foo (boolean, int[], int[], String, long)

Smali Register

  • 暫存器

Smali Function

private:invoke-direct
public, protected: invoke-virtual
static:invoke-static
parent:  invoke-super
example: invoke-xxx {參數},Class;->function(type)
# eg.
public static native String fenugreek(String str);
---------------------------------------------------
invoke-static {p0}, Lcom/hellocmu/picoctf/FlagstaffHill;->fenugreek(Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
return-object v1

參考自:https://www.slideshare.net/EnPingHsieh/android-76769248

懶得看Smali,你可以試試這個

Jadx-GUI


PicoCTF2019 droids–系列題目

droids:0

  • 利用Android Studio,觀察Logcat

droids:1

  • 是個密碼輸入框,我們試著找找

  • hint:password的位置(res)?

  • 用apktool逆出來的結果,我合理懷疑password放在java/lang/String

.line 12
    .local v0, "password":Ljava/lang/String;
    invoke-virtual {p0, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
  • 試著去strings.xml找密碼,恩找到了
apktool\one\res\values\strings.xml

  • 成功找到結果

droids:2

  • hint:Jadx-GUI
    • 有個getFlag的function,來分析看看
public static String getFlag(String input, Context ctx) {
        String[] witches = {"weatherwax", "ogg", "garlick", "nitt", "aching", "dismass"};
        int second = 3 - 3;
        int third = (3 / 3) + second;
        int fourth = (third + third) - second;
        int fifth = 3 + fourth;
        int sixth = (fifth + second) - third;
        String str = ".";
        if (input.equals("".concat(witches[fifth]).concat(str).concat(witches[third]).concat(str).concat(witches[second]).concat(str).concat(witches[sixth]).concat(str).concat(witches[3]).concat(str).concat(witches[fourth]))) {
            return sesame(input);
        }
        return "NOPE";
    }
  • 整理一下code,會變成以下這樣
public class FlagstaffHill {
    public static native String sesame(String str);
 
    public static String getFlag(String input, Context ctx) {
                            //   0            1       2         3        4         5
        String[] witches = {"weatherwax", "ogg", "garlick", "nitt", "aching", "dismass"};
        int second = 0;
        int third = 1;
        int fourth = 2;
        int fifth = 5;
        int sixth = 4;
        String str = ".";
        if (input.equals("".concat(witches[fifth]).concat(str).concat(witches[third]).concat(str).concat(witches[second]).concat(str).concat(witches[sixth]).concat(str).concat(witches[3]).concat(str).concat(witches[fourth]))) {
            return sesame(input);
        }
        return "NOPE";
    }
}
  • 整理完會是以下這個字串
dismass.ogg.weatherwax.aching.nitt.garlick
  • 丟進去輸入,看起來是對了

droids3

  • 一樣使用jadx-GUI看看
public class FlagstaffHill {
    public static native String cilantro(String str);
 
    public static String nope(String input) {
        return "don't wanna";
    }
 
    public static String yep(String input) {
        return cilantro(input);
    }
 
    public static String getFlag(String input, Context ctx) {
        return nope(input);
    }
}
  • 思路
    • 把getFlag, return的function換成yep
    • Jadx不能編輯 => 請改Smali code
    • 拆包、封裝、運行
public class FlagstaffHill {
    public static native String cilantro(String str);
 
    public static String getFlag(String input, Context ctx) {
        return nope(input); - > yep(input);
    }
}
  • 將smali-code的function name改掉,記得要sign他
    • sign的方式可以參考前面
.method public static getFlag(Ljava/lang/String;Landroid/content/Context;)Ljava/lang/String;
    .locals 1
    .param p0, "input"    # Ljava/lang/String;
    .param p1, "ctx"    # Landroid/content/Context;
 
    .line 19
    invoke-static {p0}, Lcom/hellocmu/picoctf/FlagstaffHill;->yep(Ljava/lang/String;)Ljava/lang/String;
  • 因為已經patch過了,所以直接按下按鈕即有結果

上一篇
[Day17] - Rev 0x2 組合語言
下一篇
[Day19] - Rev 0x4 linux逆逆
系列文
資訊安全的美味雜炊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言