通常来说,java题不会出现在CTF中,因为字节码的关系几乎可以反编译出源码。
这个题目看到了一些新思路,也学到了不少东西~
题目解压缩给了一个jar和dll,估计最终还是走到x86汇编上去了
逆向jar,发现java层控制GUI界面,最终将参数直接通过native函数送到了dll中—以前只知道Android可以进行native编程,原来java也是可以同样调用的
过程也相同,先loadlibrary,声明native函数后就可以调用了
逆向的时候这个dll还是有点意思
首先它具备一个DLLMAIN函数,相当于JNI_ONLOAD吧,当加载的时候会直接调用
然后native函数名同样具备格式,形如Java_class_func
反编译后发现这个函数里也会出现像(a1 + 658)(a1, str)这样的东西,根据so中的经验,这货应该是JNI方法–Native调用java层的函数。在so中是通过类型声明JNIENV*来识别的,而dll中没有这个类型。
但大体可以确认是一样的东西,那么问题就在于这个函数数组在哪儿了。
so中是sdk/ndk中的jni.h存放了该结构体(然而实践中IDA自己都准备好了,貌似不用自己导入),java中显然是在jdk环境里了。这里要确认java版本相同,否则可能会导致函数数组偏移不同。在IDA中选择File-Load File-Parse C header file…,来导入对应版本jni.h后获得struct后,导入idb并改变变量类型即可。
逆向则跟正常的PE文件无恙,无需多言。
另外,关于它的动态调试也可以一说。在IDA中首先下好断点,然后选择Local Windows Debugger后,在Attach Process里附加java.exe。再进行操作即可触发断点。
至于DLLMAIN的调试,目前还没有尝试过。猜测可能跟安卓类似,也要在java中令其等待、不加载dll吧。
TO DO LIST+1~