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噢。

posted @ 2022-07-24 11:36  一点也不咸  阅读(42)  评论(0)    收藏  举报