BUGKU-逆向(reverse)-writeup (2)

看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有没有什么运算。

if (MainActivity.is2(MainActivity.this.beg - MainActivity.this.now)) { mainActivity = MainActivity.this; mainActivity.k += 100; } else { mainActivity = MainActivity.this; mainActivity.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
解密脚本

#!usr/bin/env python #!coding=utf-8 __author__ = 'zhengjim' 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 xrange(200000,0,-1): k = k + 100 if is2(i) else k - 1 print k

算出k = 1616384

然后就可以绕过200000秒将k带入传入进去获取flag。

实现的话,用Androidkiller打开项目,因为跳转后输出了The flag is,所以搜索该字符串,双击跟过去。

BUGKU-逆向(reverse)-writeup

往上看第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

BUGKU-逆向(reverse)-writeup

然后保存,编译,安装运行就出现flag。

BUGKU-逆向(reverse)-writeup

flag

BUGKU-逆向(reverse)-writeup

逆向入门

下载后发现不是pe文件,右键txt打开,看到data:image/png;base64,iVBORXXXXXX...开头的,为图像文件。
开头添加<img scr=",结尾添加"> ,html打开。有二维码扫描既可。

BUGKU-逆向(reverse)-writeup

love

下载来用peid看是C++的,先运行下。

BUGKU-逆向(reverse)-writeup

要输入flag。用ida打开

按之前说的方法,快速定位到关键函数

BUGKU-逆向(reverse)-writeup

打F5查看伪代码

BUGKU-逆向(reverse)-writeup

可以看到有两步加密,第一步是先sub_4110BE(&Str, v0, &v11);用这个函数加密。然后再去循环加密

for ( j = 0; j < v8; ++j ) Dest[j] += j;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfypp.html