• 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

     

  • 相关阅读:
    poj 3264(RMQ或者线段树)
    LCA上的RMQ模板算法
    LCA离线算法Tarjan的模板
    poj 1330(初探LCA)
    hdu 3367(与最大生成树无关。无关。无关。重要的事情说三遍+kruskal变形)
    hdu 4496(并查集逆向添边)
    hdu 1829(继续扩展并查集)
    poj 1182 (扩展并查集)
    hdu 3038(扩展并查集)
    hdu 3371(kruskal)
  • 原文地址:https://www.cnblogs.com/zhaijiahui/p/7103776.html
Copyright © 2020-2023  润新知