这题涉及到jar2exe
的知识,所以单独拿出来写一下,顺便写一写jar2exe
怎么入手
这种方法并不适用于
jar2exe
当前的最新版(2.1.7),经过我的测试2.1.2试可用的,而且由于2.1.2的第三种加密方式还没有这么激进,后续其它版本应该也是支持的,还需要再试验。
准备工作
拿到题目DIE
查一下,发现不是一个普通的可执行文件
也就是说这本来是一个jar
文件,通过jar2exe
的方式转换成了windows可执行文件
Jar2Exe
一共有3种保护方式
- 不隐藏也不加密
- 隐藏
- 隐藏且加密
Level1
第一种方式非常简单,只需要在16进制编辑器中找到第一个PK
,即zip
的文件头,然后把这之后的另存为新文件,就可以了。但是这一题并不是采用这种方式,以这种方式提取出来的程序只包含很多生成出来的附加文件。
其实也可以直接用winrar
打开
Level2
第二种方式隐藏了原本的jar
文件,可以通过RH
来查看文件,这部分被放在了RCData
里
Level3
本题采用的是第三种,就像第二种一样,原先的jar
文件被隐藏了,但是第三种方式还进行加密,并且将整个jar
文件的结构和类名全部都混淆了(经过实验在jar2exe 2.1.2
中并不会对文件结构进行破坏),不会像第二种方式中直接dump
出来一个完整的jar
文件
Dump
要解决这道题首先就是要把有效的代码Dump
出来,这部分的内容对于第二种和第三种方式是基本一样的。
从上面可以看到这段密文的偏移,然后x64dbg
打开之后,在程序内存处根据偏移找到这段内存,设内存访问断点,程序运行起来,在dec r8d
处停下来,此时如果是采用第二种方式加密,经过一个简单的循环之后就可以把原jar
给dump
出来,但是这里还需要经过一些加密
根据脱壳的经验,找到向上跳转的最外层,就是最后一个跳转,然后直接执行到下一行
首先观察变红色的值即发生改变的值,发现r14
和r15
的值很可疑,观察前面的代码,发现会在循环处inc r15d
和inc r14
,根据这两个寄存器的值推断,r14
中的值是解密后数据的结束位置,r15
中的值B8B
为解密后数据的长度,因此,利用Scylla
把这部分内容dump
出来,出题人使用的jar2exe
版本里面的文件名都是混淆过的,需要手动修复成jar
文件,找到其中的两个class
文件,IDEA
直接就可以反编译。
逆向
dump
出来的文件包含了两个类,第一个类包含主要的处理过程
1 | // |
由此可见什么斐波那契数列并没有什么用,真正有用的是heheda()
和hello()
,其中调用了b
类的数据
1 | // |
所以直接在java
环境里运行一下就可以了
1 | //Main.java |
运行直接输出flag
1 | PCTF{1ts_not_5c2ipt_Chall3nge} |
Comments