BugkuCTF-Reverse题Timer(阿里CTF)

知识点

JEB相当于Windows平台上的IDA
smali代码:双击Bytecode,出现smali代码;相较于C之汇编,那么smali之于Java
onCreate:
一个activity启动回调的第一个函数就是onCreate,这个函数主要做这个activity启动的一些需要的初始操作的工作。

onCreate之后调用了还有onRestart()和onStart()等。

解题流程

下载apk包
apk安装之后出现一个读秒的,20万秒,大于3600,所以大于一个小时,所以太慢了,不等了。
在这里插入图片描述
jeb反编译,主要JEB反编译得到的java代码看起来比较清晰
MainActivity代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源码审计

MainActivity
在这里插入图片描述
对程序进行分析
初始操作了一些变量,其beg为(((int)(System.currentTimeMillis()/1000)+200000;
this.beg = (((int)(System.currentTimeMillis() / 1000))) + 200000;beg为一个定值,在上面代码的run()函数里,k是可以变化的

MainActivity.this.t = System.currentTimeMillis();
MainActivity.this.now = ((int)(MainActivity.this.t / 1000));
给出了now的赋值,从程序的运行来看,beg在now初始赋值后应该比now大了200000,now代表的是程序运行的时间,当now变化了200000的时候,也就是说beg小于now的时候,会进入设置flag的地方。
也就是说,程序一开始k是变化的,flag的值并没被设置,只有当beg==now的时候,flag会被设置并显示,然后到下面k可能还会变化,那么这个被设定的初始flag可能就是我们要拿到的flag了。

也即当前的系统时间除以1000,再加上200000。继续看onCreate:
最先留意的是
this.val$tv2.setText(“alictf{” + MainActivity.this.stringFromJNI2(MainActivity.this.k) + “}”);
可以看出,flag与k有关,而这里有个stringFromJNI2,其是一个底层的函数
继续阅读的话,你可以看到对k做了操作。

这里k,应该为由beg和now反复运算得到。不过,beg-now应为200000,所以,我们可以复制出代码运算得到k的值,然后,修改代码重新编译
总结思路:通过beg - now代入is2函数对k进行操作,200000,需要一秒一秒的操作,而我们,直接通过写代码模拟出200000的结果,找到k,然后改动k值,直接调用,就可以得到flag了。

提取关键代码计算出k的值
直接根据k的变化部分的函数进行模拟,算出进行了200000s之后的k值:
参考java-算k值.java:
Python脚本:

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

k=0

for i in  range(200000,0,-1):
    k = k + 100 if is2(i) else k - 1
print(k)

输出k的值为1616384,下面我们需要把k值修改为这个值,然后进入进行flag设定的if语句就可拿到flag了,下面进行操作。

通过Android killer反编译
将输出flag的条件反过来,即MainActivity$1.smali里的if-gtz v0, :cond_0这句话(后面是输出The Flag Is那里的跳转)改为if-ltz v0, :cond_0
将k值改为常量,即上文提到的smali文件里的iget v3, v3 …(省略);->k:I之后添加const v3, 1616384
在这里插入图片描述
就是大于改为小于,gt为大于,lt为小于,请求时间与系统时间的差值小于0才会显示flag
在这里插入图片描述
插入这句话,原因是k保存在v3寄存器内,因此修改v3就能修改k
(这里的v0,v1,v2,v3等都是寄存器,添加的指令就是寄存器的赋值)

把if的判断条件进行修改
if-gtz v0, :cond_0 的意思是,如果v0>0,就跳转到:cond_0,所以把gtz改为ltz。
在alictf里面的k值后面再对k进行设定。

保存,重新编译下。

修改后生成的apk路径:
file:F:\CTF\CTF_Tool\Reverse\Android\AndroidKiller\AndroidKiller_v1.3.1\projects\file\Bin\file_killer.apk
然后在模拟器里运行就可以拿到flag了。
在这里插入图片描述

注意

编译译打包程序
在编译的时候遇到以下问题
Project\res\values-v23\styles.xml:6: error: Error retrieving parent for item: No resource found that matches the given name ‘@android:style/WindowTitleBackground’.

Project\res\values-v23\styles.xml:6: error: Error retrieving parent for item: No resource found that matches the given name ‘@android:style/WindowTitleBackground’.

解决方法

解决方法
找到res/value-v23/styles.xml,把resources下的东西注释掉
找到res/value/public.xml,把所有带Base.V23的东西(两个)注释掉

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CTF ReverseCTF逆向)是一种在CTF竞赛中涉及到的目类型,要求参赛选手具备较强的反汇编和反编译技术,并能够进行逆向分析。逆向分析与功能猜测结合,通过逆向分析缩小猜测范围,然后通过逆向验证猜测的思路。 在实际的CTF Reverse练习中,参赛选手可以通过访问特定网页或平台来进行实验和练习。例如,可以尝试进入实验网页[CTF- REVERSE练习之逆向初探](https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014111410002900001&pk_campaign=freebuf- wemedia)来进行逆向初步探索。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [CTF逆向(reverse)入门脑图](https://download.csdn.net/download/qq_32465127/10744933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【完善中】CTF逆向Reverse的玩法](https://blog.csdn.net/m0_37157335/article/details/123694868)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [CTF-REVERSE练习之逆向初探](https://blog.csdn.net/text202202/article/details/129824733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值