1625-5 王子昂 总结《2017年11月30日》 【连续第426天总结】
A. JarvisOJ-Re-Fibonacci
B.
首先运行,提示
来让我们玩一个数列游戏:
a[0]=0,a[1]=1
a[2]=1,a[3]=2
a[4]=3,a[5]=5
…………..
请计算a[100000000000000]:
刚开始还以为是通过什么算法做出来,准备去百度裴波那契数列的算法,想了一下这是逆向题,还是乖乖来逆吧
拖入IDA,发现没有上述字符串出现,也没有加壳,那这些字符哪来的呢
翻了一圈字符串,发现了这些
有不少java的特征字符串,又看到了jar2exe这个程序的出现
那看来是jar2exe打包的程序咯
jar2exe将java和jvm打包生成exe,从而可以在没有JAVA的机器上直接运行
原理是通过JNI的接口,创建JVM来执行封装的java代码
与exe4j将jar导出生成临时文件不同,jar2exe是在内部执行的,因此无法直接找到临时文件来反编译
不过归根到底它还是java,就意味着仍然是通过JVM来执行字节码的JAVA
只不过这次,需要从内存中寻找蛛丝马迹了
最新查到的资料是http://blog.csdn.net/ravinow/article/details/51123839
原理是通过java提供的javaagent接口,使得每个方法执行之前都先执行dump函数
缺点就是没有被执行的方法就不会被dump了
下载https://github.com/slavemaster/e2j的e2j后在所在目录下设置
set JAVA_TOOL_OPTIONS=-javaagent:e2j-agent-1.6.jar
- 1
- 2
(没有回显提示)
然后运行所需要的程序,成功时第一句会显示picked up
然后目录下就生成了e2j-dump.jar
拖入jd-gui发现果然得到所在类啦
很清晰呢
但是好像哪里不对?
为啥没有判断直接就报错了?
这个heheda方法也没有被调用啊,下面的hello方法看起来像是RC4的样子,但是又没有被解密的代码
类b也没有出现,没头没尾的呀
刚开始我以为是dump不完全的问题,只dump到了执行的代码,而遗漏掉判断部分了。
后来做完才知道其实代码dump地很完整,只是另一个类b中因为没有方法,所以没有被JavaAgent抓到而已
于是寻求别的方法~
百度上没有解法,又去谷歌上找了一圈,这里发现详解
http://reverseengineeringtips.blogspot.com/2014/12/unpacking-jar2exe-21-extracting-jar.html
java代码被存放在RCDATA数据中,因此首先要通过pe工具找到RCDATA的地址
上文中用的是Resources Hacker Fx,但是我找了一圈都没找到合适的,能显示文件偏移的工具
最后用PE explorer 2.05(因为本题是64位的)读到RCDATA的HEX
然后再去UltraEdit中查找对应值,从而找到文件偏移
有了文件偏移就可以在x64dbg中下读取断点啦,本题是这里
F9运行,断到解密循环
按照脱壳时的解密思路,一直找到向上跳的最外围,即41E70D处
然后下一行F4,就解密完成了
查看寄存器
实验发现,或者观察代码应该也能理出
R10指向的内存就是JAVA的字节码了
使用scylla插件Dump内存
Size是猜出来的(尽量往大取,反正多Dump也不影响分析),因为寄存器里也没找到可能的长度
保存为jar格式,然后用winrar打开:
这些就是class文件了,文件名为乱码是因为被混淆了
解压出来依次打开
就能识别各个文件了
这个是完整的class文件,直接拖入JD-GUI反编译即可:
终于找到剩下那个含有静态成员的类b了
这样完整Dump下来可以确保没有代码遗漏
那么就可以确认,这个题目跟裴波那契一毛钱关系都没有了……就是要dump出java代码,然后自行执行heheda方法OTZ
将代码拖入JAVA环境,自行编译运行:
终于得到flag
C. 明日计划
JarvisOJ
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/production/markdown_views-ea0013b516.css">
</div>