Bugku time(alictf) writeup
由于看评论或者网上的writeup写的都比较简洁,可能各个师傅经验都比较丰富hhhh,但是我是菜鸡所以一边学习一边记录一下。
打开运行页面发现是:

合理推测就是过完200000秒后会给你flag的值,然后我们去用Android killer解包看看源码。

先点入口找到入口的smali,然后点一下java小茶杯就能看到源码了,比较清晰一些,不过看smali是逆向必须要求的,所以也要加强一下下。
看到onCreate函数,里面的run
这就是判断程序执行结束的标志和显示的flag,也就是beg-now<=0,flag的值就是最后的k值传到stringFromJNI2的结果。

现在我们看看beg的值是怎么变化的
初始化的时候,beg的值是当前的时间的+200000秒
然后在onCreate中多次对beg的值进行判断或操作:

然后可以看到就是一个localMainActivity的对象,算了这里实在不明白谁是谁,Java真的太难懂了,然后就是可以理解用is2函数判断beg-now的值如果返回1的话,就执行括号里面的的localMainActivity = MainActivity.this;
然后就到了我最疑惑的地方,那个for循环,我看别人的writeup是说当is2返回1时,k+100,当返回0时,k-1。通过is2去遍历200000,然后每一次操作一次k的值

那我们解题的思路就有了,首先写脚本算出k的值,然后修改smali文件后重新编译打包运行,就会显示k的值。
写脚本算k值也是根据源码的思路来写,我是用python写的,因为实在是不懂Java。
def is2(paramInt): v = True if(paramInt>3): if(paramInt%2 !=0 and paramInt%3!=0): v0 = 5 while(True): if(v0*v0<=paramInt): if(paramInt % v0 != 0 and paramInt % (v0 + 2) != 0): v0 = v0 + 6 continue return False else: return v v = False elif(paramInt<=1): v = False return v k = 0 t = 200000 for i in range(200000): if(t<=0): break if(is2(t)): k = k + 100 else: k = k - 1 t = t-1 print(k)
运行后输出的k值如下:

然后剩下的操作就是回到Androidkiller做了。
浅析一下smali代码吧,因为最近在学这个
这个就是+200000秒,给beg赋值嘛
然后给k的初始值赋值为0

那么我们要改的就是k的值了
const/4 是指把4位常量赋值给寄存器V0,我们修改V0的值时一定要把const/4改为 const,因为18aa00(1616384)的位数是大于4位的,不修改会编译失败。

然后还要修改MainActivity1里有一个判断V0的值是否为0的判断语句

如果V0大于0则跳转到cond_0,不会执行显示flag的代码,这里直接删掉就好啦

然后先ctrl s保存修改,切到Android页面,依次点击,要是已找到设备那里木有的话刷新一下,这个一键安装功能真好用呀~~

然后运行一下,我发现我的一运行就闪退,但是也能看到结果了,这个我改了好几次,有一次闪退有一次不闪退,后面再想想原因吧,去吃饭啦~

上面的就是flag噢。

浙公网安备 33010602011771号