CTF安卓逆向练习第四弹

CTF安卓逆向练习第四弹–反调试与JNI_Onload下断点

写在前面的话:继续练习,涉及到新的知识点。题目是阿里2015ctf的第二题,有反调试技术,不能直接的用IDA进行调试,因此这里介绍了两个解题的方法供参考。apk:AliCrackme_2.apk

基本概述与整体思路

拿到apk先跑一下,看看我们需要做的事情。
这里写图片描述
OK,很明确,需要我们输入一个密码,然后点击输入密码按钮,完成破解。然后看一下这个apk中有so文件,所以我们破解的思路还是从java层到native层,从静态到动态。

Java层分析

打开jeb,将apk拖进去,发现没有混淆,名字或者MainActivity很清楚,找到onCreate,发现关键地方,下面else是验证失败的提示,那么if语句就是需要验证的地方。
这里写图片描述
然后跳到securityCheck这个方法继续查看,就在下面,发现是一个native的方法,因此用到so文件,下面就开始ida的分析。
这里写图片描述

IDA静态分析

将so文件拖到ida中打开,我们来看一下securityCheck,还是从下往上看,发现这个off_628c的指针就是我们要找的。
这里写图片描述
紧接着点开这个指针,发现一个“wojiushidaan”的参数,一看就知道我们找对了,在app中试了一下,发现这个字符串并不是答案,那么很有可能就是要找这个指针的值,因此在off_628c处下断点,开始动态调试。
这里写图片描述

动态调试失败

模拟器中开启android_server,开启端口转发,将app打开,然后attach这个so,开始动态调试。忽然发现只要我们开启动态调试,这个打开的app就开始闪退,试了两次之后都是这样,说明这个app有防调试的功能,要不怎么叫自毁程序呢,因此直接动态调试这条路走不通了。下面介绍两种解决的方法,一种是针对这道题的一个快捷的方法,还有一种是JNI_onload的调试方法,第一种方法可以看一下,第二种方法尽量掌握。

快捷方法

我们继续观ida中静态分析的函数,发现在我们想要下断点看的地方的上方,有一个_android_log_print函数,这是一个打印的函数,打开monitor,发现他确实打印了,只不过打印的信息并不是我们想要的。
这里写图片描述
因此我们可以想一下,能不能将打印的这个信息往下挪一点,挪到我们要看的off_628c下面,让它能打印这个指针的内容?因此,我们要做的是把so文件中arm汇编语音对应的hex机器码进行修改,因为ida本身的修改并不能保存,因此我们不能使用F2键进行修改。这里用010editor等十六进制编辑器修改相应的机器码,然后保存,再将修改后的文件重新打包,签名,安装到虚拟机中。
这里写图片描述
这是修改后的so文件
这里写图片描述
然后就可以在monitor中看到打印的信息,这就是我们要找的flag
这里写图片描述
试一下,果然成功
这里写图片描述

JNI_Onload下断点调试

上述的方法只是针对这道题的一个巧妙的方法,下面介绍一个适用性比较广的JNI_Onload下断点调试的方法。首先我们并不能按照往常attach的方法去进行动态调试,因为我们要在app加载之前就进行调试,所以这个时候我们可以用jdb一起进行调试,jdb在android SDk包中就有。我们先在ida中,在JNI_Onload的开始地方下断点。
然后我们用调试命令开启apk,模拟器中先不要打开app,在命令行中输入一下命令

adb shell am start -D -n com.yaotong.crackme/.MainActivity

这里这个com.yaotong.crackme/.MainActivity就是我们要调试的apk中的主进程,打开之后模拟器显示进行Waiting for Debugger,这时so文件啥的还没加载进去呢
这里写图片描述
然后接下来我们按照以前的步骤,attach上,这个时候我们能找到so的进程,然后打开monitor,发现我们要调试的apk前面有个红蜘蛛
这里写图片描述
然后在ida都加载好之后,按照一起的步骤我们要点击左上角的绿色三角开始调试,但是这次不用,我们开启jdb进行调试

jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost

小tip:在使用jdb的时候一定要打开monitor
开启jdb之后,monitor变成了绿蜘蛛,然后点击F9键开始调试
这里写图片描述
然后程序会自动停在JNI_Onload的开始处,我们按F8,一步一步往下走,看看走到哪一步这个程序退出,发现到BLX R7这里退出了
这里写图片描述
然后走到退出的那一步,按F7,进入改函数,跟踪接下来的步骤,发现这个用了一个pthread_create,创建了一个新的线程,因此我们可以找到这个程序的反调试的代码处,它的反调试的原理是创建新的线程。
这里写图片描述
我们找到了反调试的地方,那么接下来怎么办,自然是把反调试的代码屏蔽掉,直接往下走就好。因此我们在BLX R7这里,将它的机器码改成0,相当于把这段代码屏蔽掉(用编辑器更改)
这里写图片描述
将修改后的so文件重新打包,签名,安装在模拟器中,找到我们IDA静态分析的关键指针处,下断点,然后用普通的方法进行动态调试,发现这回动态调试不会再退出了,其次我们下断点的地方找到R2寄存器中的值,刚好也是我们之前方法得到的值,”aiyou,bucuoo”,可见这次逆向完成!
这里写图片描述

结束语:JNI_Onload下断点的技术还需要继续练习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值