1. 程式人生 > 其它 >LoopAndLoop(阿里CTF)-Bugku

LoopAndLoop(阿里CTF)-Bugku

一道簡單的安卓逆向

載入 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}