LoopAndLoop(阿里CTF)-Bugku
阿新 • • 發佈:2021-10-19
一道簡單的安卓逆向
載入 GDA,檢視 MainActivity
可以看到題目將我們輸入的內容經過 check 的一系列變化,將變換後的結果與 1835996258 進行比較,如果一致就輸出 flag,反之輸出 "Not Right!"
所以接下來檢視 check 方法
可以看到 check 方法為 native 層的原生函式,還包含有 check1,check2,check3 方法
接下來分析一下 so 檔案,反編譯 apk,IDA 開啟 lib\armeabi\liblhm.so,定位到主函式部分
-
_JNIEnv::GetMethodID: GetFieldID 是得到 java 類裡的引數 ID,GetMethodID 得到 java 類裡方法的 ID,它們只能呼叫類裡宣告為 public 的引數或方法
-
_JNIEnv::CallIntMethod: 得到 java 類裡 Int 型別的方法
經過分析可以發現 chec 方法是根據其第二個引數 * 2 % 3 的結果呼叫 Java 層的三個 check 函式對第一個引數進行處理
所以可以依據這個思路寫出逆向指令碼,exp 如下:
#include <bits/stdc++.h> using namespace std; long long num = 1835996258; inline int check1(int input, int s) { int t = input; for (int i = 1; i < 100; i++) t -= i; return t; } inline int check2(int input, int s) { int t = input; if (!(s % 2)) { for (int i = 1; i < 1000; i++) t -= i; return t; } else { for (int i = 1; i < 1000; i++) t += i; return t; } } inline int check3(int input, int s) { int t = input; for (int i = 1; i < 10000; i++) t -= i; return t; } int main() { for (int i = 2; i < 100; i++) { if (2 * i % 3 == 0) num = check1(num, i - 1); else if (2 * i % 3 == 1) num = check2(num, i - 1); else num = check3(num, i - 1); } cout << num << endl; return 0; }
得到 236492408,輸入得到 flag
alictf{Jan6N100p3r}