PicoCTF - droids1

PicoCTF - droids1

Backgroud

Android App 逆向入門之一:拆開與重組 apk : 強烈建議新手在打之前可以先看一下這篇,稍微了解一下整體怎麼包apk以及比要檔案有哪些,或是他們儲存的資料類型之類的

Tools

  • apktool 跟著installation guide就可以安裝成功,此工具目的在於拆解apk,我們知道apk就是一個壓縮檔,如果直接用unzip這種指令,也可以打開,只不過一些經過編譯後的byte code就還是byte code,而apktool可以在解壓縮的同時還原這些byte code
  • Android Studio: 此工具目的在於利用emulator把該軟體安裝後跑起來
  • JADX: 和ApkTool一樣,可以反編譯apk,但有GUI(Recommended)
       $ wget https://github.com/skylot/jadx/releases/download/v1.1.0/jadx-1.1.0.zip
       $ unzip jadx-1.1.0.zip -d jadx
       $ cd jadx
       $ cd ./bin
       $ ./jadx-gui
    

Recon

這一題有兩種方法可以反編譯apk,一種是利用ApkTool,另外一個是JADX,兩者差在有無GUI(JADX有),主要是參考1的WP

Exploit

ApkTools

1
2
3
4
5
6
7
8
9
10
11
12
$ apktool d one.apk
I: Using Apktool 2.8.1 on one.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\Bernie\AppData\Local\apktool\framework.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

如果有按照上面的guide把apktool裝起來,就可以直接下指令,參數d代表decode,對於比較熟Android架構的人來說應該綽綽有餘,畢竟要到哪邊找code/strings之類的,通常都會是那幾個地方,例如: Code會放在./smali/com/hellocmu/picoctf/(PS: 只不過code很醜,畢竟是smali) Strings會放在./res/values/strings.xml

根據2的教學:

在我們利用 apktool d 拆開的內容中,有一個資料夾叫做 smali,裡面存放著的就是從 classes.dex 還原出來的東西,也就是程式碼 Smali 是跑在 Android Dalvik VM 上的 byte code,有著自己的一套語法規則,如果想要看到我們熟悉的 Java 程式碼,必須要將 smali 還原成 Java。

JADX

其實用jadx也可以直接反編譯,而且還有GUI可以看,不香ㄇ 用JADX一樣可以在相同的地方找到code,只是這一些code已經被還原成java

package com.hellocmu.picoctf;

import android.content.Context;

/* loaded from: classes.dex */
public class FlagstaffHill {
    public static native String fenugreek(String str);

    public static String getFlag(String input, Context ctx) {
        String password = ctx.getString(R.string.password);
        return input.equals(password) ? fenugreek(input) : "NOPE";
    }
}

可以看到FlagstaffHill這個class有兩個member(fenugreek/getFlag),所以看起來他會把我們輸入的東西和password這個variable做比較,如果一樣就會去call fenugreek(input),否則回傳NOPE 而password是從R.string.password來的,可以看到password的值是0x7f0b002f應該是一個offset?或是一個地址,不是很確定 反正最後取strings的地方在./Resource/resources.arsc/res/values/strings.xml

然後我們就可以利用Android Studio或是直接在自己的手機安裝這個apk,接著輸入password(opossum)就可以拿到flag了

Flag: picoCTF{pining.for.the.fjords}

Reference