2016 AliCTF Timer 50
2016年阿里CTF的第一道Mobile题,分值50
使用Jadx反编译样本,刚开始看着代码感觉有点怪怪的,看了一会,整理了逻辑,使用postDelayed()
循环执行,间隔为1s

is2()
函数用于判断素数

那么在去掉其余代码,总结就是:循环200000次,然后循环的时候进行素数判断,根据判断的结果进行不同的操作
Java还原
package test;
public class Main {
public static void main(String[] args) throws Exception{
int beg = 200000;
int k = 0;
int i;
for(i = beg; i > 0; i--){
if(is2(beg - i)) {
k += 100;
} else {
k--;
}
}
System.out.println(Integer.toString(k));
System.out.println("Finish!");
}
public static boolean is2(long l) {
if (l <= 3) {
if (l > 1) {
return true;
}
return false;
} else if (l % 2 == 0 || l % 3 == 0) {
return false;
} else {
int i = 5;
while (i * i <= l) {
if (l % i == 0 || l % (i + 2) == 0) {
return false;
}
i += 6;
}
return true;
}
}
}
跑出结果
1616384
Finish!
那么这个数字传入
public native String stringFromJNI2(int i);
这是一个native方法,小书包里掏出IDA

我去,一堆除和余,分析太费劲,反正没有其它的干扰了,写个APP自己调用这个so
package net.bluelotus.tomorrow.easyandroid;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.wnagzihxa1n.demo.R;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("lhm");
}
public native String stringFromJNI2(int number);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Toast.makeText(this, stringFromJNI2(1616384), Toast.LENGTH_LONG).show();
Log.i("wnagzihxa1n", stringFromJNI2(1616384));
}
}
有几点要注意
so直接放
src/main/
目录下的jniLibs
,没有就自己创建,记得把armeabi
带上调用类的路径需要和so里描述的一样,不然会找不到方法
int __fastcall Java_net_bluelotus_tomorrow_easyandroid_MainActivity_stringFromJNI2(int a1, int a2, signed int a3)
最后看一下完整的路径结构,这种调用so的方法不需要修改build.gradle
,虽然不建议

跑起来,输出flag
03-28 09:02:21.066 25084-25084/com.wnagzihxa1n.demo I/wnagzihxa1n: Y0vAr3TimerMa3te7
毕竟才50分,还要分析so那简直太折腾,还是走捷径比较好,要是想锻炼so分析能力的同学可以去折腾一下
Last updated