XCTF_MOBILE14_APK逆向

初见

题目除了一个apk附件外,还有一条提示信息:“备注:本题提交大括号内值即可”。

还是先来具体体验一下,先安装APP:

 上图中,最后的“TopCtf”就是本题的APP。打开它:

 就一个输入控件,一个按钮。

随便输入一个字符串,点击确定,提示“错误”:

 从体验上就这些信息,下面对APP的apk文件进行静态分析。

静态分析

使用jadx打开apk文件,可以看到该APP除了资源类“R”和配置类“BuildConfig”,只有一个类“MainActivity”。重点分析MainActivity。

MainActivity

在MainActivity的onCreate函数中,可以看到注册按钮事件响应函数的代码:

    public void onCreate(Bundle savedInstanceState) {
       ... ...
        this.btn_register.setOnClickListener(new View.OnClickListener() { 
            public void onClick(View v) {
                if (!MainActivity.this.checkSN(MainActivity.this.edit_userName.trim(), MainActivity.this.edit_sn.getText().toString().trim())) {
                    Toast.makeText(MainActivity.this, (int) R.string.unsuccessed, 0).show();
                    return;
                }
                Toast.makeText(MainActivity.this, (int) R.string.successed, 0).show();
                MainActivity.this.btn_register.setEnabled(false);
                MainActivity.this.setTitle(R.string.registered);
            }
        });
    }

按钮事件响应函数的核心流程是:

  1. 调用checkSN检查输入是否正确。
  2. 检查成功,打印“恭喜您!”
  3. 检查失败,打印“错误”。

所以,重点在checkSN函数对输入内容的检查。

调用checkSN时传入了两个参数,第一个参数为edit_userName控件的内容,第二个参数为edit_sn控件的内容。

edit_userName控件的内容在MainActivity的onCreate函数中能找到赋值:

this.edit_userName = "Tenshine";

edit_sn控件的内容就是我们的输入。

checkSN

checkSN函数有两个参数,一个是userName,一个是sn。核心代码为:

    public boolean checkSN(String userName, String sn) {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.reset();
            digest.update(userName.getBytes());
            String hexstr = toHexString(digest.digest(), "");
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hexstr.length(); i += 2) {
                sb.append(hexstr.charAt(i));
            }
            if (("flag{" + sb.toString() + "}").equalsIgnoreCase(sn)) {
                return true;
            }
            return false;
        
    }

核心功能为:

  1. 对userName计算MD5
  2. 将计算得到的MD5转换为16进制字符串
  3. 取MD5字符串的所有下标为偶数(0/2/......)的字符,组成新字符串
  4. 在新字符串前面加上“flag{”,在后面加上“}”,组成校验字符串
  5. 比较输入字符串和校验字符串是否相同

从上面可知,userName为“Tenshine”。

其MD5值为“b9c77224ff234f27ac6badf83b855c76”

取下标为偶数的字符得到字符串“bc72f242a6af3857”

加上前面的“flag{”和后面的“}”为“flag{bc72f242a6af3857}”。

在APP的界面输入“flag{bc72f242a6af3857}”,提示成功:

 根据题目的提示信息“备注:本题提交大括号内值即可”,flag为“bc72f242a6af3857”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值