180804 逆向-一个Java题的CM

83 篇文章 3 订阅

通常来说,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~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值