XCTF_MOBILE9_RememberOther

初见

下载附件,是一个zip。

解压后有一个docx,一个apk。

打开docx看看,里面就一句话:

        不懂安卓,所以就只是和安卓扯了扯边,,,Have fun~

没看出什么作用。

在模拟器中运行一下apk:

 随便输入用户名和注册码:

 没有更多信息了,反编译看看。

静态分析

将apk重命名为zip,解压。

使用dex2jar对解压得到的dex文件进行反编译:

使用jd-jui查看反编译得到的jar包。

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

this.btn_register.setOnClickListener(new View.OnClickListener() {
          public void onClick(View param1View) {
            if (!MainActivity.this.checkSN(MainActivity.this.edit_userName.getText().toString().trim(), MainActivity.this.edit_sn.getText().toString().trim())) {
              Toast.makeText((Context)MainActivity.this, 2131034123, 0).show();
              return;
            } 
            Toast.makeText((Context)MainActivity.this, 2131034120, 0).show();
            MainActivity.this.btn_register.setEnabled(false);
            MainActivity.this.setTitle(2131034118);
          }
});

核心就是调用checkSN函数,参数为用户名和注册码字符串。checkSN函数的返回值就表示注册是否成功。

当checkSN返回0时,通过Toast打印编号为2131034123的字符串。

当checkSN返回1时,通过Toast打印编号为2131034120的字符串。

在jd-gui左侧的类列表中切换到R.class,可以看到这两个编号对应的字符串名分别为:

 public static final class string {
    ... ...
    
    public static final int successed = 2131034120;
    
    ... ...
    
    public static final int unsuccessed = 2131034123;
    
    ... ...
  }

从字符串名字就能知道,编号2131034120表示成功,也就是checkSN函数返回1,表示注册成功。

下面中的看看checkSN函数,看看如何让它返回1。

checkSN

反编译后的函数代码为:

private boolean checkSN(String paramString1, String paramString2) {
    boolean bool = true;
    try {
      if (paramString1.length() == 0 && paramString2.length() == 0)
        return true; 
      if (paramString1 == null || paramString1.length() == 0)
        return false; 
      if (paramString2 == null || paramString2.length() != 16)
        return false; 
      MessageDigest messageDigest = MessageDigest.getInstance("MD5");
      messageDigest.reset();
      messageDigest.update(paramString1.getBytes());
      paramString1 = toHexString(messageDigest.digest(), "");
      StringBuilder stringBuilder = new StringBuilder();
      for (int i = 0; i < paramString1.length(); i += 2)
        stringBuilder.append(paramString1.charAt(i)); 
      boolean bool1 = stringBuilder.toString().equalsIgnoreCase(paramString2);
      if (!bool1)
        return false; 
    } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
      noSuchAlgorithmException.printStackTrace();
      bool = false;
    } 
    return bool;
}

看上去,内容挺多的,里面还出现了计算MD5的代码。

但是,当我们检查返回值时,发现一个有趣的地方,在第一个if判断中,如果参数两个字符串都为空,函数返回1。

if (paramString1.length() == 0 && paramString2.length() == 0)
        return true; 

这不正是我们想要的嘛。

但这里又存在两种情况:

  1. 注册成功后,程序打印出要提交的flag。这种情况下,只要checkSN返回1即可。
  2. 输入正确的flag,程序才注册成功。这种情况下,输入空字符串,虽然能让checkSN返回1,但还是不知道该提交的flag。

不管是哪种情况,我们先试一下,输入空用户名和注册码,结果如下:

 得到一串md5值,到md5破解网站解密一下,明文为:

        YOU_KNOW_

直接提交,不正确。这串字符串是做什么的,暂时不知道。

既然取巧失败,就回到checkSN函数本身去分析下它的验证算法。

这里是一个很明确的MD5计算过程。就是对用户名计算MD5,然后和注册码比较。

但比较过程时不是去完整的MD5值,而是隔一个字符取一个。MD5一共32个字符,这里隔一个字符取一个,取得16个字符:

for (int i = 0; i < paramString1.length(); i += 2)
        stringBuilder.append(paramString1.charAt(i)); 

如果取出的16个字符,等于输入的注册码,就注册成功。

根据算法,提供用户名:A;注册码:7c67ea0a153b2ab2;(原MD5:7fc56270e7a70fa81a5935b72eacbe29)

注册成功,弹出和上面一样的MD5值。

这表示,能注册成功的,用户名和注册码组合有无数对。对任一用户名,都有一正确的注册码与之对应。

小机灵鬼?

到这里没思路了,后来查了别人的解题才理解作者的意图。

docx文档里的那就话,在这里就要用了。文档中说不懂安卓,而这里就要在md5解密后的字符串后面填上ANDROID。变成:

        YOU_KNOW_ANDROID

提交这串字符串就对了。

还是脑洞不够大!

 

———————————————————————————————————————————

欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: pure_color xctf是一个CTF比赛平台,致力于举办和推广网络安全竞赛。 pure_color xctf的目标是为安全爱好者和专业人士提供一个学习、切磋和交流的平台。这个平台上举办的比赛覆盖了各种网络安全领域,包括但不限于网络攻防、密码学、逆向工程等。通过参与这些比赛,参赛者可以提升自己的技能,了解最新的安全威胁和攻击技术,锻炼解决问题的能力。 pure_color xctf的比赛模式多样,可以是个人或团队参与。参赛者需要在限定的时间内完成一系列的题目,这些题目可能包含漏洞分析、编程挑战、数据分析等。比赛过程中,参赛者需要运用各种技术手段,如渗透测试、代码审计、漏洞利用等,解决题目的要求。参赛者不仅需要具备网络安全相关的知识,还需要具备良好的团队合作和解决问题的能力。 此外,pure_color xctf也为参赛者提供了一个交流平台。比赛期间,参赛者可以在平台上与其他选手交流经验、讨论解题思路。参赛者也可以通过竞赛结果来评估自己的能力,并与其他选手进行切磋比拼。 总之,pure_color xctf是一个举办网络安全竞赛的平台,旨在为安全爱好者和专业人士提供学习和交流的机会,促进网络安全技术的发展。 ### 回答2: pure_color xctf 是一项竞技性的网络安全挑战赛。XCCTF 是全球知名的网络安全竞赛组织之一,而 pure_color 是该竞赛组织内的一项赛事。该赛事旨在提升参赛者的网络安全技能和知识,让他们在一个仿真的网络环境中进行攻防对抗。 在 pure_color xctf 中,参赛队伍将根据题目要求进行网络攻击和防御。这些题目有不同的难度级别,并涵盖了各种不同的网络安全技术和攻击类型。参赛队伍将需要利用他们的知识和技能,像真实的黑客一样去攻击系统漏洞,获取目标系统内的敏感信息或是直接控制目标系统。同时,他们也需要通过搭建防御策略和系统来保护自己的系统免受攻击。 pure_color xctf 不仅仅是一个交流学习的平台,也是一个展示能力的舞台。优胜的参赛队伍将会被邀请参加更高级别的网络安全竞赛和会议,进一步提升他们的技能并扩展职业网络。此外,pure_color xctf 也为参赛者提供了一个找到职业机会的平台,很多安全公司和组织会在赛事期间招聘优秀的选手。 总而言之,pure_color xctf 是一个有挑战性的网络安全竞赛,旨在通过攻击和防御对抗提升参赛者的技能,并为他们提供职业发展和展示的机会。同时,这个赛事也在促进网络安全领域的交流和合作,为提升整个网络安全行业的水平做出贡献。 ### 回答3: pure_color xctf 是一个CTF(Capture The Flag,夺旗赛)竞赛平台。CTF是一种网络安全竞赛,旨在让参赛者通过解决一系列的密码学、逆向工程、漏洞利用等问题来获取旗标,比赛者可以通过这些旗标来获取积分并竞争排名。 pure_color xctf 平台是一个为CTF竞赛提供的一个在线环境,类似于一个实验室,用于举办CTF比赛。在这个平台上,参赛者可以注册账号并加入已经发布的CTF赛事中。赛事中的题目被分为不同的难度级别,涵盖了各种安全领域的知识。参赛者需要通过解决题目中的任务来获取旗标,并将其提交到平台上进行验证。在比赛结束后,将根据参赛者解决的题目数量、用时、积分等因素来计算最终排名,并颁发奖励给获胜者。 pure_color xctf 提供了逼真的仿真环境,使得参赛者能够在一个安全的网络环境下进行实时的攻防演练。平台上的题目多样化且具有挑战性,旨在让参赛者将所学的理论知识应用到实际场景中去,并培养解决问题和团队合作的能力。同时,pure_color xctf 还为参赛者提供了交流平台,方便他们在比赛过程中与其他参赛者交流经验、技巧以及解题思路。 总之,pure_color xctf 是一个提供CTF竞赛平台的在线环境,旨在鼓励参赛者在安全领域中深入学习和实践,并通过解决各种挑战赛题目来提升技能和知识水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值