工具
我用的是逍遥模拟器
jeb,和Android Killer进行反编译
反编译对代码分析
对程序进行分析
beg = (((int)(System.currentTimeMillis() / 1000))) + 200000
在上面代码的run()函数里,beg为一个定值,k是可以变化的
MainActivity.this.t = System.currentTimeMillis();
MainActivity.this.now = ((int)(MainActivity.this.t / 1000));
给出了now的赋值,从程序的运行来看,beg在now初始赋值后应该比now大了200000,now代表的是程序运行的时间,当now变化了200000的时候,也就是说beg小于now的时候,会进入设置flag的地方。
也就是说,程序一开始k是变化的,flag的值并没被设置,只有当beg==now的时候,flag会被设置并显示,然后到下面k可能还会变化,那么这个被设定的初始flag可能就是我们要拿到的flag了。
可以明显地看到正常时间是执行200000秒然后k的值固定,此时的flag为正确答案
也就是说名k需要被被执行了200000次
开始操作
编写代码求k
java
public class Main {
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;
}
}
}
v1 = false;
}
else if(n <= 1) {
v1 = false;
}
return v1;
}
public static void main(String args[]) {
int time = 200000;
int k = 0;
while (time > 0) {
if (is2(time)) {
k += 100;
}
else {
k--;
}
time--;
}
System.out.println(k);
}
}
python版
def is2(n):
if n <= 3:
if n > 1:
return True
return False
elif n % 2 == 0 or n % 3 == 0:
return False
else:
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True
k = 0
for i in range(200000):
if is2(i):
k = k + 100
else:
k = k - 1
print(k)
得出k=1616384
修改源码重新进行编译
首先把判断语句改为lez
然后对k赋值为为定量
然后重新编译安装运行即可
得出flag
alictf{Y0vAr3TimerMa3te7}
flag{Y0vAr3TimerMa3te7}