School Lab: PicoCTF Android Challenges

Loạt bài Lab thực hành Reverse Engineering ứng dụng Android thông qua các thử thách từ PicoCTF.

Challenge 1: one.apk

Sau khi nhấn nút "Hello, I am a button", vào trong adb logcat để kiểm tra flag.

Logcat output for one.apk

Flag: picoCTF{a.moose.once.bit.my.sister}

Challenge 2: two.apk

Source code (sử dụng Bytecode Viewer để xem source code và code Smali):

Source code analysis Encryption logic

Chương trình so sánh đầu vào (var0) và đoạn text bí mật (var1). Ta dùng Frida để hook Context.getString(int) nhằm xem nội dung của var1:

# Frida Hook Script
hook_code = """
Java.perform(function(){
    var Context = Java.use('android.content.Context');
    Context.getString.overload('int').implementation = function(resId) {
        var ret = this.getString(resId);
        console.log('Context.getString(int) -> ' + ret);
        return ret;
    };
});
"""

Kết quả sau khi hook:

Capturing secret string via Frida Flag displayed in app

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

Challenge 3: three.apk

Challenge này có thể giải bằng cách phân tích mã giả (pseudo-code) và tính toán thủ công:

Pseudo-code for three.apk

Các biến được tính toán như sau:

  • var2 = 0, var3 = 1, var5 = 2, var4 = 5
  • Thứ tự ghép chuỗi: var6[5], var6[1], var6[0], var6[4], var6[3], var6[2]

Final assembled string

Flag: picoCTF{what.is.your.favourite.colour}

Challenge 4: four.apk

Mục tiêu là dẫn chương trình đến hàm cilantro (nằm trong yep), nhưng getFlag mặc định gọi nope. Ta sử dụng apktool để sửa mã Smali:

Decompiled source folder Patching Smali from 'nope' to 'yep'

Sau đó đóng gói, ký và cài đặt lại APK:

App displaying flag after patch

Flag: picoCTF{tis.but.a.scratch}

Challenge 5: five.apk

Source code of five.apk

Phân tích chuỗi được tạo ra bởi StringBuilder:

  • Các mảnh ghép lại: "alpha" + "bet" + "soup" = alphabetsoup.

Kiểm tra chuỗi:

Initial validation

Tiến hành patch Smali để gọi trực tiếp hàm cardamom:

Injecting Smali call Flag results

Flag: picoCTF{not.particularly.silly}