• 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

     

  • 相关阅读:
    Android 操作系统的内存回收机制(转载)
    如何减少代码中的分支语句
    Android中动画学习
    Android中 AsyncTask
    Linux安装后更新系统
    看百度宣传片
    可爱的linux mint 11
    ubuntu 修改root密码
    SHA256加密算法封装[我的代码库]
    使用maven,svn和CruiseControl做持续集成
  • 原文地址:https://www.cnblogs.com/zhaijiahui/p/7103776.html
Copyright © 2020-2023  润新知