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()相当于是毫秒为单位,获取当前时间

2016 alictf Timer writeup

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

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

2016 alictf Timer writeup

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

2016 alictf Timer writeup

分成三段来看:

第一段: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函数的位置,这一块方法结束了,没找到逻辑,

2016 alictf Timer writeup

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

2016 alictf Timer writeup

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

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

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

2016 alictf Timer writeup

重打包,得到flag

2016 alictf Timer writeup

上一篇:固定滚动外层div的css


下一篇:ASP.NET Web API 应用教程(一) ——数据流使用