看onCreate方法,找到关键处
if (MainActivity.this.beg - MainActivity.this.now <= 0) { tv1.setText("The flag is:"); tv2.setText("alictf{" + MainActivity.this.stringFromJNI2(MainActivity.this.k) + "}"); }所以MainActivity.this.beg - MainActivity.this.now <= 0 就是过了得时间。如果过了200000秒则出现flag。flag是使用native层来打印。
思路:能不能直接跳过200000秒直接出现flag呢?
有一个关键变量k,往下看,看看k有没有什么运算。
将差值用is2函数判断,如果true,就k+100 ,如果false,就k-1。那就要看下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; } }直接照着写一个即可,然后可以算出关键变量k
解密脚本
算出k = 1616384
然后就可以绕过200000秒将k带入传入进去获取flag。
实现的话,用Androidkiller打开项目,因为跳转后输出了The flag is,所以搜索该字符串,双击跟过去。
往上看第113行的if-gtz v0, :cond_0。 if-ltz是如果大于0跳转 ,那改成如果小于0跳转就跳过了200000秒等待了。对应的语句为if-ltz v0, :cond_0。
然后要找到赋值k的位置,看第129行-149行,因为k的值是在alictf{和}之间传入的。
看到了139行的的iget v3, v3, Lnet/bluelotus/tomorrow/easyandroid/MainActivity;->k:I,知道v3是k的值。
于是在下面赋值const v3,1616384
然后保存,编译,安装运行就出现flag。
flag
逆向入门下载后发现不是pe文件,右键txt打开,看到data:image/png;base64,iVBORXXXXXX...开头的,为图像文件。
开头添加<img scr=",结尾添加"> ,html打开。有二维码扫描既可。
下载来用peid看是C++的,先运行下。
要输入flag。用ida打开
按之前说的方法,快速定位到关键函数
打F5查看伪代码
可以看到有两步加密,第一步是先sub_4110BE(&Str, v0, &v11);用这个函数加密。然后再去循环加密
for ( j = 0; j < v8; ++j ) Dest[j] += j;