171130 逆向-JarvisOJ(Fibonacci)

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,发现没有上述字符串出现,也没有加壳,那这些字符哪来的呢

翻了一圈字符串,发现了这些
171130 逆向-JarvisOJ(Fibonacci)_第1张图片

有不少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

(没有回显提示)
然后运行所需要的程序,成功时第一句会显示picked up
171130 逆向-JarvisOJ(Fibonacci)_第2张图片

然后目录下就生成了e2j-dump.jar
拖入jd-gui发现果然得到所在类啦
171130 逆向-JarvisOJ(Fibonacci)_第3张图片
很清晰呢

但是好像哪里不对?
为啥没有判断直接就报错了?
这个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
171130 逆向-JarvisOJ(Fibonacci)_第4张图片
然后再去UltraEdit中查找对应值,从而找到文件偏移

有了文件偏移就可以在x64dbg中下读取断点啦,本题是这里
171130 逆向-JarvisOJ(Fibonacci)_第5张图片
F9运行,断到解密循环
171130 逆向-JarvisOJ(Fibonacci)_第6张图片

按照脱壳时的解密思路,一直找到向上跳的最外围,即41E70D处
然后下一行F4,就解密完成了

查看寄存器
171130 逆向-JarvisOJ(Fibonacci)_第7张图片
实验发现,或者观察代码应该也能理出
R10指向的内存就是JAVA的字节码了

使用scylla插件Dump内存
171130 逆向-JarvisOJ(Fibonacci)_第8张图片
Size是猜出来的(尽量往大取,反正多Dump也不影响分析),因为寄存器里也没找到可能的长度

保存为jar格式,然后用winrar打开:
171130 逆向-JarvisOJ(Fibonacci)_第9张图片
这些就是class文件了,文件名为乱码是因为被混淆了

解压出来依次打开
171130 逆向-JarvisOJ(Fibonacci)_第10张图片
就能识别各个文件了

这个是完整的class文件,直接拖入JD-GUI反编译即可:
171130 逆向-JarvisOJ(Fibonacci)_第11张图片
终于找到剩下那个含有静态成员的类b了

这样完整Dump下来可以确保没有代码遗漏
那么就可以确认,这个题目跟裴波那契一毛钱关系都没有了……就是要dump出java代码,然后自行执行heheda方法OTZ

将代码拖入JAVA环境,自行编译运行:
171130 逆向-JarvisOJ(Fibonacci)_第12张图片
终于得到flag

C. 明日计划
JarvisOJ

你可能感兴趣的:(CTF)