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