首页 > 代码库 > 2016 alictf Timer writeup

2016 alictf Timer writeup

Timer-smali逆向

 

参考文档:http://blog.csdn.net/qq_29343201/article/details/51649962

 

题目链接: https://pan.baidu.com/s/1jINx7Fo   (在里面找相应的名字就行) 

题目描述:每秒触发一次计算,共有200000秒,答案参与计算,不可能等待下去。

使用工具:Android Killer,jadx-gui

解题方法有多种,我参照网上的一种方法。通过对native层,代码的还原,计算出200000秒后的关键变量k,传入主调用,得到答案

解题过程:

System.currentTimeMillis()相当于是毫秒为单位,获取当前时间

 技术分享

先是把单位变成秒,然后加上200000秒

第二块逻辑,用于筛选秒数的自定义函数,可以忽略,之后按代码逻辑就行

 技术分享

第三块逻辑,主程序段,包含最后打印flag值的代码段

 技术分享

分成三段来看:

第一段:super继承,调用页面设计框架,实例化handler函数

第二段:t的作用在于将时间一点一点减少,beg的值在前面,代表一开始时间,now代表现在的时间

第三段:当差值为0或小于打印flag,否则调用is2函数判断,true,k+100,false,k-1

 

所以有了下面的解密程序

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;

def main():
    time = 200000
    k = 0
    while time > 0:
        if is2(time):
            k += 100
        else:
            k -= 1
        time -= 1
    print(k)


if __name__ == __main__:
    main()

 

将得到的k值传给native代码,此时的k是经过200000运算的k,传进去直接返回结果

 

在传入native的时候要注意,首先要确定run函数的位置,这一块方法结束了,没找到逻辑,

 技术分享

通过字符串搜索找到run函数的位置,在MainActivity$1.smali中

 技术分享

直接将k传入不用运行200000次,需要更改"The flag is:"之前的关键跳转

if-gtz v0, :cond_0 改为 if-ltz v0, :cond_0

根据分析,k的值是v3的值,所以要在获取v3之后,修改v3的值

 技术分享

重打包,得到flag

技术分享

嘿嘿,又做出来一道。

2016 alictf Timer writeup