http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)

时间:2021-12-11 10:26:58
  做了第一个android apk逆向题,很多工具啥的还没用过,再接再厉。
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
  找到方法发现这个apk支持的SDK API是15-17,于是就下载了API 16并制作了模拟器,但发现还是运行不起来,不纠结,使用真机成功安装。目前从正向看还没有啥效果,那就从逆向分析代码看功能吧。
  反编译工具JEB。花时间搭上,反编译后发现MainActivity中存在flag字样,那这一块是有关键的功能咯。
  分析下它这儿的代码:
package net.bluelotus.tomorrow.easyandroid;
 
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
    int beg;
    int k;
    int now;
    long t;
 
    static {
        System.loadLibrary("lhm");
    }
 
    public MainActivity() {
        super();
        this.beg = (((int)(System.currentTimeMillis() / 1000))) + 200000;
        this.k = 0;
        this.t = 0;
    }
 
    public static boolean is2(int arg4) {
        boolean v1 = true;
        if(arg4 > 3) {
            if(arg4 % 2 != 0 && arg4 % 3 != 0) {
                int v0 = 5;
                while(true) {
                    if(v0 * v0 <= arg4) {
                        if(arg4 % v0 != 0 && arg4 % (v0 + 2) != 0) {
                            v0 += 6;
                            continue;
                        }
 
                        return false;
                    }
                    else {
                        return v1;
                    }
                }
 
                return false;
            }
 
            v1 = false;
        }
        else if(arg4 <= 1) {
            v1 = false;
        }
 
        return v1;
    }
 
    protected void onCreate(Bundle arg7) {
        super.onCreate(arg7);
        this.setContentView(0x7F040018);
        View v2 = this.findViewById(0x7F0C0050);
        View v3 = this.findViewById(0x7F0C0051);
        Handler v0 = new Handler();
        v0.postDelayed(new Runnable(((TextView)v3), ((TextView)v2), v0) {
            public void run() {
                MainActivity.this.t = System.currentTimeMillis();
                MainActivity.this.now = ((int)(MainActivity.this.t / 1000));  // Int会只保留整数位的数
                MainActivity.this.t = 1500 - MainActivity.this.t % 1000;  // 存在一种情况,即在200000秒之后,会得到flag
                this.val$tv2.setText("AliCTF");
                if(MainActivity.this.beg - MainActivity.this.now <= 0) {
                    this.val$tv1.setText("The flag is:");
                    this.val$tv2.setText("alictf{" + MainActivity.this.stringFromJNI2(MainActivity.this.k) + "}");
                }
 
                if(MainActivity.is2(MainActivity.this.beg - MainActivity.this.now)) {
                    MainActivity.this.k += 100;
                }
                else {
                    --MainActivity.this.k;
                }
 
                this.val$tv1.setText("Time Remaining(s):" + (MainActivity.this.beg - MainActivity.this.now));
                this.val$handler.postDelayed(((Runnable)this), MainActivity.this.t);
            }
        }, 0);
    }
 
    public boolean onCreateOptionsMenu(Menu arg3) {
        this.getMenuInflater().inflate(0x7F0D0000, arg3);
        return 1;
    }
 
    public boolean onOptionsItemSelected(MenuItem arg3) {
        boolean v1 = arg3.getItemId() == 0x7F0C005F ? true : super.onOptionsItemSelected(arg3);
        return v1;
    }
 
    public native String stringFromJNI2(int arg1) {
    }
}
  核心的一个函数是postDelayed(),它会划定时间间隔,然后定时地执行此函数的功能。本代码中此函数的功能中表明,如果时间间距MainActivity.this.beg - MainActivity.this.now <= 0,即会得到flag(它主要由MainActivity.this.k决定)。可这个条件满足后,flag中stringFromJNI2的功能逻辑是不可见的。
  因此,接下来分析的步骤应该是搞清楚功能逻辑,编码算出k值,再将它编译进apk中运行获得flag。emmmm,机智。
1.算出k值
  经过持续地分析功能逻辑,可知初始的时间间距大约是200000秒,并且存在一种情况,就是200000秒后,条件MainActivity.this.beg - MainActivity.this.now <= 0会达到。因此,愉快地编程算出200000秒后的k值吧。
  java编程代码如下:
package main;
 
public class main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i;
        int beg= (((int)(System.currentTimeMillis() / 1000))) + 200000;
        int k = 0;
        int now;
        long t = 0;
        boolean b;
        int n=200000;
        for (i=0;i<200000;i++){
            b=is2(n);
            if (b){
                k+=100;
            }
            else{
                --k;
            }
            n--;
        }
        System.out.println(k);
    }
    static boolean is2(int n) {
        boolean v1 = true;
        if(n > 3) {
            if(n % 2 != 0 && n % 3 != 0) {
                int v0 = 5;
                while(true) {
                    if(v0 * v0 <= n) {
                        if(n % v0 != 0 && n % (v0 + 2) != 0) {
                            v0 += 6;
                            continue;
                        }
 
                        return false;
                    }
                    else {
                        return v1;
                    }
                }
            }
 
            v1 = false;
        }
        else if(n <= 1) {
            v1 = false;
        }
 
        return v1;
    }
 
}
  愉快地执行后,可知k为1616384。
2.将k值写入apk中。
  那个,JEB只能查看反编译后的源码,却不能修改,那怎么办捏?可以使用apktool。
  进入apktool终端,即可看见帮助,简简单单的功能,但实用哦。使用命令apktool d -o C:\Users\wz\Desktop\1 C:\Users\wz\Desktop\1.apk,将反编译的结果保存到文件1中。出现下图信息,说明反编译成功。
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
  开始修改咯。该怎么修改捏?
  结合前面的分析可知,已经能够直接得到flag对应的k值了,这样应该让程序顺利地运行到修改好的flag处即可。那么应该有两处修改:(1)逻辑修改(使程序从长时间的循环中跳脱出来);(2)k修改(在flag相关k值最近的地方修改它)
  emmmmm,结合JEB的代码,依照如下图修改即可。咳咳,smali编码不太懂,临时简单弄得哈,意思是直接跳转到输入flag的那段语句里面,并且修改k值为1616384。
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
  嗯,使用apktool重新编译,命令为apktool b -o C:\Users\wz\Desktop\2.apk  C:\Users\wz\Desktop\1
  出现如下信息,说明编译成功。
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
  此时装在手机上运行,还是不行,没有认证,需要对它进行加密签名。java环境本身带着相应的keytool工具。
  首先生成证书。命令为 keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
其中:
-genkey 产生证书文件 
-alias 产生别名 
-keystore 指定密钥库的.keystore文件中 
-keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法) 
-validity 为证书有效天数,这里我们写的是40000天
提示信息如下:
输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么? [Unknown]: test
您的组织单位名称是什么? [Unknown]: test
您的组织名称是什么? [Unknown]:
您所在的城市或区域名称是什么? [Unknown]:
您所在的州或省份名称是什么? [Unknown]:
该单位的两字母国家代码是什么 [Unknown]:
CN=test, OU=test, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗?
[否]: y
 
输入<demo.keystore>的主密码 (如果和 keystore 密码相同,按回车):
 
  根据自己情况输入,即生成证书demo.keystore,如下。
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
  开始签名啦。命令为 jarsigner -verbose -keystore demo.keystore 2.apk demo.keystore
其中:
-verbose 指定生成详细输出 
-keystore 指定数字证书存储路径
  签名成功。如下图所示。
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
  运行看看,获取到flag,哈哈。
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)
 

http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)的更多相关文章

  1. java中计时器的用法Timer和TimerTask的用法&lowbar;&lowbar;java中利用Timer与TImerTask 计时器间隔执行任务

          经常我们都会有这样的需求,要固定的每隔一段时间执行某一个任务.比如:   我们做一个缓存来减少与数据库的交互,而为了使缓存与数据库中的数据尽量达到同步,需要每个固定的一段时间去数据库中的数 ...

  2. http&colon;&sol;&sol;ctf&period;bugku&period;com&sol;challenges&num;&percnt;E9&percnt;80&percnt;86&percnt;E5&percnt;90&percnt;91&percnt;E5&percnt;85&percnt;A5&percnt;E9&percnt;97&percnt;A8&colon;bugku--逆向入门

      文件是:   分析挺简单,主要是data urls知识点.     首先使用peid检测是否加壳,发现它居然是jpg文件.使用notepad++查看,结果如下.   嗯,百度一下子,知道了data ...

  3. http&colon;&sol;&sol;ctf&period;bugku&period;com&sol;challenges&num;Mountain&percnt;20climbing&colon;bugku--Mountain-Climbing

      分析这道题,爽,能够结合IDA和ollydbg分析代码,美滋滋.但如果以后能直接根据汇编容易地看懂逻辑那就更好了. 参考链接: https://blog.csdn.net/cossack9989/ ...

  4. http&colon;&sol;&sol;ctf&period;bugku&period;com&sol;challenges&num;love&colon;bugku--love

      做了一道逆向题目,主要关联到base64编码的知识点.下面做一分析. 题目如下:   通过测试,可知它没有加壳.尝试使用IDA进行分析. 1.IDA分析文件   打开文件后,按[shift+F12 ...

  5. http&colon;&sol;&sol;ctf&period;bugku&period;com&sol;challenges&num;&percnt;E6&percnt;B8&percnt;B8&percnt;E6&percnt;88&percnt;8F&percnt;E8&percnt;BF&percnt;87&percnt;E5&percnt;85&percnt;B3--游戏过关

      做成功这道逆向题了,哈哈哈哈.   启程.   运行了一下子程序,发现它是要保证所有灯亮着才会给flag.如下图所示.   我聪明滴认为首先可以通过关键字符串找到关键代码位置哦. 1.找到关键代码 ...

  6. http&colon;&sol;&sol;ctf&period;bugku&period;com&sol;challenges&num;Easy&lowbar;Re

      今天做一道逆向题,开心,见证了自己汇编的用途.     首先看它是否加壳? 1.加壳检测   是vc编程的,没有加壳,可以愉快地分析了.   2.分析程序,找到flag.   首先运行一下子程序, ...

  7. Timer&lpar;阿里CTF&rpar;

    下载文件之后发现是.apk类型文件,于是百度搜索了一下推荐再电脑上安装安卓模拟器,都尝试了一下逍遥安卓是真的不好用,小白觉得还是BlueStacks好用一些,下载之后去安装打开就看到了, 什么都没有发 ...

  8. 并发调用get请求

    http://zeusami.iteye.com/blog/1172864 package com.alibaba.xteam.web.travel.module.rpc; import java.i ...

  9. 阿里云存储OSS之九大使用技巧

    http://www.biphp.com/cloud-computing/%E9%98%BF%E9%87%8C%E4%BA%91%E5%AD%98%E5%82%A8oss%E4%B9%8B%E4%B9 ...

随机推荐

  1. 【bzoj1010】 HNOI2008—玩具装箱toy

    http://www.lydsy.com/JudgeOnline/problem.php?id=1010 (题目链接) 题意 给定N个物品,可以连续的划分为若干个组,每个组的代价是(物品数-1+每个物 ...

  2. &lbrack;Unity&rsqb; Shader - CG语言 和 HLSL语言

    CG 跟 HLSL几乎是一摸一样的. (HLSL官方参考,包含语法格式,函数库,关键字,在这个地方: http://msdn.microsoft.com/en-us/library/bb509638( ...

  3. QImage 图像格式小结

    原地址:http://tracey2076.blog.51cto.com/1623739/539690 嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚, ...

  4. 初学JavaScript(入门一)

    javaScript是世界上最流行的脚本语言   在我们的手机.电脑设备上所浏览的所有网页,以及基于HTML5手机App的交互都是通过javaScript驱动的,所以javascript是前端工作的一 ...

  5. There are no accidents&period;

    愿你攒齐足够多的失望,开启新的生活. 要知道,瀑布是江河走投无路时创造的奇迹

  6. 使用堆实现Top K 算法 JS 实现

    1. 堆算法Top,时间复杂度 O(LogN) function top(arr,comp){ if(arr.length == 0){return ;} var i = arr.length / 2 ...

  7. 设置RichEdit相关颜色说明

    1.设置RichEdit客户区的背景颜色 要设置RichEdit的背景色,需要发送 EM_SETBKGNDCOLOR 消息给RichEdit控件,关于该消息的说明:wParam参数 为颜色选项,如果是 ...

  8. 读书笔记 effective c&plus;&plus; Item 11 在operator&equals;中处理自我赋值

    1.自我赋值是如何发生的 当一个对象委派给自己的时候,自我赋值就会发生: class Widget { ... }; Widget w; ... w = w; // assignment to sel ...

  9. ios中的safari转换时间戳问题

    后台下发的时间格式如:2016-09-15 15:30:10:也没多想,直接用new Date('2016-09-15 15:30:10').getTime()获取时间戳:开发时候,电脑调试OK,当放 ...

  10. 学习安卓开发&lbrack;2&rsqb; - 在Activity中托管Fragment

    目录 在上一篇学习安卓开发[1]-程序结构.Activity生命周期及页面通信中,学习了Activity的一些基础应用,基于这些知识,可以构建一些简单的APP了,但这还远远不够,本节会学习如何使用Ac ...