XCTF_MOBILE15_人民的名义-抓捕赵德汉1-200

初见

题目附件为一个jar文件。

提示信息为:flag{xxxxxx},这是flag格式的提示。

直接运行jar:

提示输入password。

输入错误显示“Incorrect password”,并要求再次输入:

从运行情况看,重点在password的验证上。

下面静态分析一下jar文件。

静态分析

使用jd-gui打开jar文件,看见里面有6个文件:

三个后缀名为class的为类文件。

简单看一下三个类文件,可以发现,checkPassword类基础自ClassLoader,并实现了main方法。也就是这个jar文件的入口函数。

main方法

main方法主要做两件事:

  1. 创建checkerObject对象。
  2. 在一个循环中使用checkerObject.checkPassword方法检测用户输入

main方法里,提示用户输入、提示输入错误的字符串,和运行时看到的一致:

    CheckInterface checkerObject = loadCheckerObject();
    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
      System.out.println("Enter password:");
      String line = stdin.readLine();
      if (checkerObject.checkPassword(line)) {
        System.out.println("Well done, that is the correct password");
        System.exit(0);
        continue;
      } 
      System.out.println("Incorrect password");
    }

现在要重点搞清楚checkerObject的checkPassword方法如何检测用户的输入。

checkPassword方法

直接在jd-gui点击checkPassword方法名,会定位到CheckInterface类:

public interface CheckInterface {
  boolean checkPassword(String paramString);
}

可见,CheckInterface类是一个接口,里面包含一个方法checkPassword。

那么谁实现了这个接口呢,我第一反应想到了CheckPassword和CheckInterface之外的第三个类newClassName:

public class CheckPass implements CheckInterface {
  public boolean checkPassword(String input) {
    MessageDigest md5Obj = null;
    try {
      md5Obj = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
      System.out.println("Hash Algorithm not supported");
      System.exit(-1);
    } 
    byte[] hashBytes = new byte[40];
    md5Obj.update(input.getBytes(), 0, input.length());
    hashBytes = md5Obj.digest();
    return byteArrayToHexString(hashBytes).equals("fa3733c647dca53a66cf8df953c2d539");
  }
  
  ... ...
}

可见这个类实现了CheckInterface接口,并且有checkPassword方法。

这个checkPassword方法也很简单,就是对输入的字符串计算MD5,比较MD5值是否为"fa3733c647dca53a66cf8df953c2d539"。到MD5破解网站上可以直接得到明文:

 将monkey99提交给jar程序,显示验证通过:

提交flag为:flag{monkey99},题目验证通过。

看上去题目已经做完了,但真的如此嘛?

事实并不这样简单

在CheckPassword类的main方法中可以看到,checkerObject对象来自于loadCheckerObject函数的返回值。看看loadCheckerObject函数的反编译代码,发现checkerObject对象其实和newClassName没有关系,而是来自对ClassEnc文件的解密:

  private static CheckInterface loadCheckerObject() {
    CheckPassword mycl = new CheckPassword();
    InputStream in = CheckPassword.class.getClass().getResourceAsStream("/ClassEnc");
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    int len = 0;
    byte[] bytes = new byte[512];
    while ((len = in.read(bytes)) > -1)
      bout.write(bytes, 0, len); 
    byte[] myClassBytesEnc = bout.toByteArray();
    in.close();
    SecretKeySpec secretKeySpec = new SecretKeySpec(hexStringToByteArray(hexKey), "AES");
    Cipher decAEScipher = Cipher.getInstance("AES");
    decAEScipher.init(2, secretKeySpec);
    byte[] myClassBytes = decAEScipher.doFinal(myClassBytesEnc);
    Class<CheckInterface> myclass = (Class)mycl.defineClass(null, myClassBytes, 0, myClassBytes.length);
    CheckInterface passCheckObject = myclass.newInstance();
    return passCheckObject;
  }

这个函数其实就是以hexKey为秘钥,用AES算法对ClassEnc文件进行解密,并用解密后的内容创建一个新类,最后创建一个这个新类的对象并返回。

可见,checkerObject对象其实是这里解密后的类的对象,而不是newClassName类的对象,之前我们仅根据newClassName类实现了CheckInterface接口,假设这两者有关系,虽然成功解题了,却只是歪打正着。

将jar文件的后缀名修改为zip,解压后,即可得到ClassEnc文件。使用下面的python脚本即可对ClassEnc文件进行解密:

import os
from Crypto.Cipher import AES
filename="ClassEnc"
key = "bb27630cf264f8567d185008c10c3f96"
key_bytes = bytes.fromhex(key)
aes = AES.new((key_bytes), AES.MODE_ECB)
data = bytearray(os.path.getsize(filename))    
with open(filename, 'rb') as f:        
	f.readinto(data)    
	f.close()    
decryption_data = aes.decrypt(data)
with open(filename+"_decryption", 'ba') as f:
    f.write(decryption_data)
f.close()

运行该脚本后,解密ClassEnc文件,并将解密后内容保存在ClassEnc_decryption文件中。

有趣的是,这里解密后的ClassEnc_decryption文件和jar包里自带的newClassName.class文件是完全一致的。难怪按照newClassName.class类也可以解出题目。

这里不知是题目作者故意留下newClassName.class文件还是忘了删除newClassName.class文件。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值