• 下载下来的文件是一个jar包,用die和binwalk检查,确实是一个纯正的jar包

  • java -jar FileName运行jar包,观察文件的外部特征,发现也是判断password的题目

  • 用查看jar包的工具jd-gui查看反编译的代码

  • 大致浏览打码,发现UnitTests中的main函数很可疑,该段代码如下:


public static void main(String[] args)
{
JFrame frame = new JFrame("Key check");
JButton button = new JButton("Click to activate"); button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
String str = JOptionPane.showInputDialog(null, "Enter the product key: ",
"xxxx-xxxx-xxxx-xxxx", 1);
if (₪₪₪₪₪₪₪₪₪₪₪₪.ℑℌℳ(str)) {
JOptionPane.showMessageDialog(null, "Well done that was the correct key",
"Key check", 1);
} else {
JOptionPane.showMessageDialog(null, " Sorry that was the incorrect key \nRemember it is a crime to use software without paying for it",
"Key check", 1);
}
}
});

​ 虽然我不懂java,但也大致能看出这是突破点,str为输入的字符串,且应为xxxx-xxxx-xxxx-xxxx形式 ,只需要让₪₪₪₪₪₪₪₪₪₪₪₪.ℑℌℳ(str)的返回值为1即可

  • 跟进₪₪₪₪₪₪₪₪₪₪₪₪.ℑℌℳ(str)函数

public static boolean ℑℌℳ(String 和咊)
{
if ((和咊 != null) && (和咊.length() == 19))
{
ªı_ = System.arraycopy(_ıª, 0, ªı_, 5, 5); boolean keyGuessWrong = true;
int ȥ = 0;
for (int ƶ = 0; ƶ < 4; ƶ++)
{
for (int ẓ = 0; ẓ < 4; ẓ++) {
if (和咊.charAt(ȥ + ẓ) != ªı_.charAt(Start.₪₪₪₪₪₪₪₪₪₪₪₪(ȥ + ẓ, ªı_))) {
keyGuessWrong = false;
}
}
ȥ += 5;
}
return keyGuessWrong;
}
return false;
}

百度了charAt等函数的作用后,可以得到这段代码的逻辑

  • 跟进Start.₪₪₪₪₪₪₪₪₪₪₪₪(ȥ + ẓ, ªı_) ,相关代码如下:

public static int ₪₪₪₪₪₪₪₪₪₪₪₪(int ৲, String ₢)
{
return ﷼௹૱(৲) % ₢.length();
} private static int ﷼௹૱(int ৲)
{
if (৲ > 2) {
return ﷼௹૱(৲ - 1) + ﷼௹૱(৲ - 2);
}
return 1;
}

可以看出这个函数的逻辑:

  • ﷼௹૱返回num[0] = num[1] = num[2] = 1的斐波那契数列
  • ₪₪₪₪₪₪₪₪₪₪₪₪返回斐波那契数列模₢.length()的值
  • 于是再分析字符串₢(即为传递的参数ªı_) , 发现ªı_ 是由ªı_ = System.arraycopy(ıª, 0, ªı, 5, 5); 产生的;

java中有名为System.arraycopy的函数,但跟进去System.arraycopy函数可以发现这里的System.arraycopy函数是出题者自己定义的,这是本题最大的坑点

  • 跟进System.arraycopy函数

public static String arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
{
return Start.main(null);
} --------------分割线-----------
public static String main(String... args)
{
String x = "";
for (int $ : "vȾ¤ÊÊ¬ÆÆÊv̤ʲʲÀΤ¨¸¬".toCharArray()) {
x = x + (char)(($ >> 1) + 15);
}
return x;
}

可以看出arraycopy函数是伪装成库函数的自定义函数,并且返回值与传递的参数无关,返回的x字符串是固定的

  • 根据百度到的java语法规则分析上段代码逻辑:

    x是由一段乱码vȾ¤ÊÊ¬ÆÆÊv̤ʲʲÀΤ¨¸¬ 中的每两位经过(char) ( (ch >> 1) + 15 )操作得来的,这段乱码转化成unicode格式为v\u00C8\u00BE\u00A4\u00CA\u00CA\u00AC\u00C6\u00C6\u00CAv\u00CC\u00A4\u00CA\u00B2\u00CA\u00B2\u00C0\u00CE\u00A4\u00A8\u00B8\u00AC

Help -> preference 中转化为unicode

着重解释为什么是每次去了两位:

Java中的编码规则是utf-8,每个字符占两个字节,int占四个字节,因此每次循环中,取了这段字符串中的4/2=2位,然后按照小端存储的规则,将取出的两位代入运算

大小端存储参考资料

http://www.cnblogs.com/WangAoBo/p/6369979.html

如果直接分析的话,在字节转化这里会遇到问题,当然这个问题可以用一种很直接的方法来解决,请拉倒文末。

  • 即可解题,由上述分析得到脚本:


    import sys
    key = 'JsnatterrtJuaththovacke'#unicode码经过处理后的字符串
    num = [1, 1, 1] for i in range(3,26):
    num.append( num[i - 1] + num[i - 2] )
    num[i] %= 23 #print len(key) sys.stdout.write('flag{') #"flag{",
    Z = 0
    for a in range(4):
    for b in range(4):
    sys.stdout.write(key[ num[Z + b] ]) #key[ num[Z + b] ], Z += 5 if Z != 20:
    sys.stdout.write('-')# '-', sys.stdout.write('}') #'}'


这个题更直接的做法是像官方的Writeup一样直接利用逆出的java代码写脚本,这样就不用考虑字节之间、编码之间的转换问题了。

同时可用JD—GUI的src导出功能,用eclipse导入sec文件方便分析

附官方writeup脚本


public class test {
//static String arr1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//static String arr2 = "ZYXWVUTSRQPONMLKJIHGFEDCBA";
public static void main(String args[]){
String arr1 = "JsnatterrtJuaththovacke";
for(int i=0;i<19;i++){
if(i==4||i==9||i==14||i==19){
System.out.print('-');
}else{
System.out.print(arr1.charAt(check(i,arr1)));
}
}
}
public static int check(int i,String arg){
return te(i)%arg.length();
}
public static int te(int i){
if(i>2){
return te(i-1)+te(i-2);
}
return 1;
}
}

最后得到flag为flag{sssn-trtk-tcea-akJr}

2017年陕西省网络空间安全技术大赛——人民的名义-抓捕赵德汉2——Writeup的更多相关文章

  1. 2017年陕西省网络空间安全技术大赛——种棵树吧——Writeup

    2017年陕西省网络空间安全技术大赛——种棵树吧——Writeup 下载下来的zip解压得到两个jpg图片,在Kali中使用binwalk查看文件类型如下图: 有两个发现: 1111.jpg 隐藏了一 ...

  2. 2017年陕西省网络空间安全技术大赛——一维码——Writeup

    <!doctype html> 2017年陕西省网络空间安全技术大赛——一维码——Writeup 先判断下载的文件flag.png确实是png格式的图片后(binwalk, file命令均 ...

  3. 陕西省网络空间安全技术大赛部分题目writeup

    签到-欢迎来到CSTC2017 10 欢迎来到CSTC2017 ZmxhZ3tXZWlTdW9GeXVfQmllTGFuZ30= Base64解密:flag{WeiSuoFyu_BieLang} 种棵 ...

  4. 2017年网络空间安全技术大赛部分writeup

    作为一个bin小子,这次一个bin都没做出来,我很羞愧. 0x00 拯救鲁班七号 具体操作不多说,直接进入反编译源码阶段 可以看到,只要2处的str等于a就可以了,而str是由1处的checkPass ...

  5. 2016第二届陕西省网络空间安全大赛WriteUp

    2016年5月28号(正式比赛) 有选择题和实践题,俩队员在弄选择题时,我去拿了web1的一血. 0x01 web 是一道代码审计题,发包,返回了源代码: <?php if (isset($_G ...

  6. 第三届“百越杯”福建省高校网络空间安全大赛_Do you know upload?

    题目在i春秋的ctf训练营 既然是上传,那就直接抓包 二话不说上来先给个00截断传个一句话助助兴 直接就成功了.... 赶紧操起菜刀去连接 进去之后发现ctf.sql是个空文件,那么flag应该在数据 ...

  7. 第三届“百越杯”福建省高校网络空间安全大赛writeup--Do you know upload?

    一打开网址,可以看出应该是文件上传漏洞,查看源码,也有可能是文件包含 上传个图片,成功,然后上传一句话木马 通过bp进行上传绕过 , 开始菜刀连接http://e00b6eca3c9c4e14a31c ...

  8. i春秋-第三届“百越杯”福建省高校网络空间安全大赛-Do you know upload?

    进去提示有提示文件包含漏洞 拿到源码发现这里上传验证只有MIME验证 可直接抓包改 image/gif 绕过 接下来就是这次学到的点了 菜刀连接过后怎么都找不到flag文件,但是这里找到了数据库配置文 ...

  9. 2019寒假训练营寒假作业(二) MOOC的网络空间安全概论笔记部分

    视频课程--MOOC的网络空间安全概论笔记 第一章 网络空间安全概述 2001年,网络空间概念被首次提出: 网络空间安全框架: 1.设备层安全: 可通过截获电磁辐射获取计算机信息.通过硬件木马(恶意电 ...

随机推荐

  1. 更新了svn 后,某个文件多了几个副本如:xxx.r1 xxx.r3 xxx.mine等,正常文件名xxx

    分析:更新了svn后 原因: 是的,修改完后,还要把问号文件全部删除,再重新提交(话说,你的SVN名字和我的名字一样,wk).你每次修改之前都更新一下最好了.

  2. 给阿里云主机添加swap分区,解决问题:c++: internal compiler error: Killed (program cc1plus)

    前言 今天安装spdlog,一个快速得C++日志库,按照文档步骤,不料出现了一堆错误,像c++: internal compiler error: Killed (program cc1plus)等一 ...

  3. Appium连接模拟器

    Appnium 环境搭建 覆盖文件 将SDK中platform-tools目录下的这三个文件 复制到模拟安装路径bin目录下,覆盖原有的这三个文件 adb命令 开启服务 adb start-serve ...

  4. spring 切点表达式

    spring切点表达式: 1.*通配符:该通配符主要用于匹配单个单词. 例如:execution(* com.bonnie.Controller.TestController.*()) 上述表达式表示 ...

  5. batchsize用法 以及实现前向运算的矩阵乘法方式

    batchsize用法 以及实现前向运算的矩阵乘法方式 待办 使用batchsize可以把矩阵缩小,采用矩阵乘法的形式可以一次计算多个经过神经网络的结果,然后通过交叉熵进行计算总的损失得到结果. 所以 ...

  6. 其他-使用 ProcessExplorer 定位 win10 系统资源占用

    1. 概述 使用 ProcessExplorer 2. 环境 os win10 3. 背景 偶然在论坛上看到了一个工具 ProcessExplorer 作用是 定位当前桌面窗口 对应的 进程 我没有这 ...

  7. MySql 中关键字 case when then else end 的用法

    解释: SELECT case -------------如果 ' then '男' -------------sex='1',则返回值'男' ' then '女' -------------sex= ...

  8. 关于spring boot集成MQTT

    安装 说到mqtt,首先肯定要安装了,安装什么的地址:http://activemq.apache.org/ap...我本地是Windows的环境,所以装的是Windows版本,这里是第一个注意的地方 ...

  9. oracle分组并在组内排序

    根据c1,c2分组,并且根据c3排序,取第一行select tt.*  from (select row_number() over(partition by c1, c2 order by c3 d ...

  10. 滑动窗口-洛谷T1866(单调队列)

    咕咕咕 单调队列板子题 一.基本 1.单调队列: 特殊的双端队列,内部元素.分为最大队列(单调递增)和最小队列(单调递减)两种 二.应用 本题中:大部分单调队列优化的动态规划问题都和定长连续子区间的最 ...