2016 Alictf Android Timer Writeup

/ 0评 / 0

Timer是移动端的第一题,难度比较小,看看java就行了

题目背景是初始化200000秒时间,过了这个时间flag就会出来,我们不可能能等这么久,所以需要手动去逆向出来

int beg = (((int) (System.currentTimeMillis() / 1000)) + 200000);  取当前时间转为秒为单位并加上20w秒
final Handler handler = new Handler();
       handler.postDelayed(new Runnable() {
           public void run() {
               MainActivity.this.t = System.currentTimeMillis();
               MainActivity.this.now = (int) (MainActivity.this.t / 1000);
               MainActivity.this.t = 1500 - (MainActivity.this.t % 1000);    //1500减去当前时间的秒数除以1000的余数
               tv2.setText("AliCTF");
               if (MainActivity.this.beg - MainActivity.this.now <= 0) {               //当20w秒到达时,进入此判断
                   tv1.setText("The flag is:");                
                   tv2.setText("alictf{" + MainActivity.this.stringFromJNI2(MainActivity.this.k) + "}");       //由于此处k值是参与运算的,所以不能直接修改秒数强制进入判断条件,计算出k后传入native
               }
               MainActivity mainActivity;
               if (MainActivity.is2(MainActivity.this.beg - MainActivity.this.now)) {
                   mainActivity = MainActivity.this;
                   mainActivity.k += 100;
               } else {
                   mainActivity = MainActivity.this;
                   mainActivity.k--;
               }
               tv1.setText("Time Remaining(s):" + (MainActivity.this.beg - MainActivity.this.now));
               handler.postDelayed(this, MainActivity.this.t);    //等待t时间后进入下一次循环
           }
       }, 0);

is2函数代码

public static boolean is2(int n) {
    if (n <= 3) {
        if (n > 1) {
            return true;
        }
        return false;
    } else if (n % 2 == 0 || n % 3 == 0) {
        return false;
    } else {
        int i = 5;
        while (i * i <= n) {
            if (n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
            i += 6;
        }
        return true;
    }
}

其实is2完全可以忽略,只需要考虑onCreate方法中的函数即可
由于代码没混淆,我直接尝试重新编写了个app,添加了多个log,打印了t的值,实测发现t几乎约等于1s,相当于每过一秒进行一次循环,其实这也没什么鸟用,估计就是为了防止线程堵塞,真正计算时完全可以忽略
尝试按照他的逻辑复制函数

static int  beg =(( (int) (System.currentTimeMillis()/1000))+200000);
    static int now;
    static  long start = System.currentTimeMillis();
    static  int k =0;
    static long med =0;
    static  int g =0;
    public static  void main(String[] args){
 
        System.out.println(start%1000);
        while (true){
            start +=med;
            now=(int)(start/1000);
            med =1500-start%1000;
//            System.out.println(med);
            if (beg - now <=0) {
                System.out.println(k);
                break;
            }
            if(is2(beg-now)){
                g=k;
                k+=100;
            }else {
                g=k;
                k--;
            }
        };
 
    }

计算结果k=1616384
传入native,得到flag

发表评论

电子邮件地址不会被公开。 必填项已用*标注