Bugku-CTF-阿里Timer
可以先拖到模拟器里面去看看效果
等200000秒,有时间的可以尝试一下
拖进androidkiller里面看下
这就是smali代码,就相当于一种新的语言。看不懂也不要紧,点击java标志就可以切换为java代码。
第一张图片中beg = (int)(System.currentTimeMillis() / 1000L) + 200000;
这就和之前的200000秒对上了
oncreat就是函数的入口
注意run函数下的三行代码
MainActivity.this.t = System.currentTimeMillis();
MainActivity.this.now = ((int)(MainActivity.this.t / 1000L));
获得系统的时间,再进行运算。
MainActivity.this.t = (1500L - MainActivity.this.t % 1000L);
这里的t上面的t不同,指的是这200000次运行的时间间隔
if (MainActivity.this.beg - MainActivity.this.now <= 0)
{
paramBundle.setText(“The flag is:”);
localTextView.setText(“alictf{” + MainActivity.this.stringFromJNI2(MainActivity.this.k) + “}”);
这里就是条件beg的值是固定不变的200000秒,而now的值是不断增加的
这就是第一个要改的判断
还一个就是判断成功后的MainActivity.this.stringFromJNI2(MainActivity.this.k)
这里JNI2就是so文件,对k进行计算,如果计算200000次后,k的值是正确的就输出flag,否则必然是错的。
for (localMainActivity.k += 100;; localMainActivity.k -= 1)
{
paramBundle.setText(“Time Remaining(s):” + (MainActivity.this.beg - MainActivity.this.now));
localHandler.postDelayed(this, MainActivity.this.t);
return;
这就是k运算的流程,用JEB2看会清楚一些。
那现在要做就是改判断,打开androidkiller,找到对应的字段
这个程序比较简单,很快就能找到相应的字段,也可以在左边的搜索框搜索
if-gtz v0, :cond_0这里就是判断条件
改为if-lez v0, :cond_0意思是v0小于等于0,就可以跳过等待了
然后点左上角的编译就可以把代码编译出来了
注意选择合适的apktool,修改完后记得设置为默认。不一定最新的apktool就适用。
安装新的安卓程序就会发现随着时间的变化,输出的flag也在变。
计算k值的代码如下
public static boolean is2(int n) {
boolean v1 = true;
if(n > 3) {
if(n % 2 != 0 && n % 3 != 0) {
int v0 = 5;
while(true) {
if(v0 * v0 <= n) {
if(n % v0 != 0 && n % (v0 + 2) != 0) {
v0 += 6;
continue;
}
return false;
}
else {
return v1;
}
}
return false;
}
v1 = false;
}
else if(n <= 1) {
v1 = false;
}
return v1;
}
if(MainActivity.is2(MainActivity.this.beg - MainActivity.this.now)) {
MainActivity.this.k += 100;
}
else {
--MainActivity.this.k;
}
public static boolean is2(int n) {
boolean v1 = true;
if(n > 3) {
if(n % 2 != 0 && n % 3 != 0) {
int v0 = 5;
while(true) {
if(v0 * v0 <= n) {
if(n % v0 != 0 && n % (v0 + 2) != 0) {
v0 += 6;
continue;
}
return false;
}
else {
return v1;
}
}
return false;
}
v1 = false;
}
else if(n <= 1) {
v1 = false;
}
return v1;
}
if(MainActivity.is2(MainActivity.this.beg - MainActivity.this.now)) {
MainActivity.this.k += 100;
}
else {
--MainActivity.this.k;
}
加得到的k值1616384添加到smali文件中
再次编译打包运行,即可得到flag