JADX打开,直奔入口
MainActivity.java 这个类 重点:
public native int IsCorrect(String str);
public native int processObjectArrayFromNative(String str);
public void onCreate() {
this.b = EditText;
this.e = Build.SERIAL; "设备标识,可能是想限制模拟器"
this.d = 114366;
"然后给了按钮一个响应事件,代码在a类里面"
Button.setOnClickListener(new a(this));
}
我们去看看a类里的onClick()有啥
public void onClick(View view) {
String editable = mainActivity.b.getText();
int processObjectArrayFromNative = mainActivity.processObjectArrayFromNative(editable);
int IsCorrect = mainActivity.IsCorrect(editable);
String str = String.valueOf(mainActivity.d + processObjectArrayFromNative) + " ";
byte[] digest = MD5(str.getBytes());
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
sb.append(Integer.toString((b & 255) + 256, 16).substring(1));
}
if (IsCorrect == 1 && mainActivity.e != "unknown") {
mainActivity.c.setText("Sharif_CTF(" + sb.toString() + ")");
}
if (IsCorrect == 1 && mainActivity.e == "unknown") {
mainActivity.c.setText("Just keep Trying :-)");
}
if (IsCorrect == 0) {
mainActivity.c.setText("Just keep Trying :-)");
}
}
可以看到,代码逻辑是用Naive方法MainActivity.IsCorrect对输入的字符串处理,
如果函数返回1,则输出flag。
那我们用IDA打开lib中的libadnjni.so文件
不难猜到v9就是我们输入的字符串
v12的值是ef57f3fe3cf603c03890ee588878c0ec
然后用strcmp把v9和v12进行了比较,一通分析猜测,要使此函数返回1,入参应该等于v12
真机测试,flag为 Sharif_CTF(833489ef285e6fa80690099efc5d9c9d)