android o cm主题,第一个android cm调试分析

0x00:写在前面

一直想入门Android安全,当时是极客大挑战出题的时候,被cx表哥甩锅强行去学了点android的开发,之后慢慢接触,感觉还是挺有意思的。cx表哥说先从逆向分析入门吧,之后可以搞加固/漏洞方向。

这篇文章是在学习蒸米的文章七武器的一个记录。

0x01:

这次记录的是2014阿里移动挑战赛里的一个简单的cm的分析,主要是native层的调试和对简单反调试的bypass。

因为原来自用的三星放家里了,就只能使用模拟器来搞了,坑还是不少。

本来我是想用Genymotion的,但是这个模拟器是x86构架,IDA的调试的server并没有支持的,只能用Android Studio自带的模拟器。

使用模拟器调试so里的代码时有问题(后面会提到)

94e8f2994e7f7526e827de95b5efd907.png

对于我这样的新手,我一般会把apk拖进jeb直接分析看看,这个apk的验证是在so中做的验证,所以使用IDA对so做初步的分析。

0x02:找到验证的函数

de21e437cb8b943e712f854f9533aa9a.png

根据以前搞pc端的经验,下一步直接起调试器,对这个函数下断点,单步跟就好了。但是这个程序在IDA attach上之后程序就退出了,需要对JNI_Onload()函数进行调试分析。

根据蒸米的文章,步骤如下

首先是上传IDA的server到模拟器中,这里我遇到了一个问题

57d676949729252f5ba5db0658cbc897.png

提示只读,对应的解决方法是

1

2root@generic:/ # umount /

root@generic:/ # mount -o remount rw /

之后再上传运行就可以啦。

然后,需要端口转发 adb forward tcp:23946 tcp:23946一般IDA去attach的时候这个函数早就执行过了,所以需要调试JNI_Onload();因为需要用到jdb,所以需要打开ddms。

之后再使用adb以调试的模式启动程序adb shell am start -D -n com.yaotong.crackme/.MainActivity

5f508d3843de299a083ceed3306b1669.png

IDA里attach

64476bb7a08188bde1431d95647a993c.png

设置调试选项后F9

83a7326e183402af6456f5e035765ea0.png

此时使用jdb工具恢复程序jdb.exe -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700;

然后对含有验证算法的so的JNI_Onload()方法下断点,F9,就断下来了。

98dbef35e3e3841a8e4bd60a3f59978a.png

0x03:

使用IDA调试方便在于,使用P将代码块识别成函数后,可以直接F5。单步执行到

65f3c81ed90be039033a2edc466bda21.png

之后,就跑飞了,应该是有反调试,F7进去看看是什么反调试。

497d449714cdc81369b89e55bc6dbd16.png

应该是创建子进程去检测有没有调试器了。 so中的反调试策略应该和linux那些差不多,这个so中的检测方式是,打开/proc/[pid]/status文件,检测tracerpid的值是不是0。

那么对应的策略有两种,要么调试的时候动态改寄存器,或者改跳;或者一劳永逸,直接patch掉这个so。在分析了这个so反调试所在的函数后,我选择后种方案

d8d34c3d3b8a59e2d31bbab13424f353.png

死循环调用来检测调试,还是patch来的方便些。

在调试的时候我遇到这样一个问题,F7/F8都没法执行下去。

10498c478d989e807718e6807bcd023d.png

问了cx表哥后,表哥说这是模拟器才有的问题…在出问题的代码上下断,然后F9过去就好了。

这样的确可以解决问题,但是在调试的时候遇到好几次这样的问题,每次遇到了都要全部重新来过,太麻烦了,还是真机调试好QAQ

0x04:

patch这个so的时候,蒸米使用的那个IDA的插件我没找到,所以我选择反编译这个apk,然后修改了so文件后,重打包签名弄回去 =。=

9a14db56fb931d1868f103ab51860d55.png

修改0x16B8处的指令就好了,这里采用蒸米的方案,使用movs r0,r0作为NOP指令。

修改后使用apktools打包回去,再使用签名工具签名就好了。再次安装已经patch好的apk,重复之前调试的步骤,这次对Java_com_yaotong_crackme_MainActivity_securityCheck方法下断点,

回到模拟器里随便输入点什么,按下输入密码按钮,IDA里就断下来了,就可以愉快的单步调试了。

c9986fcc5fc153181868d20f031611c1.png

双开IDA可以辅助分析,这个地方就是加密的字符串所在的地址

35c167ab4c35153fb0e3ba4ce1459f6b.png

点进去之后查看

0904bf90d9a4c9f448544ab1c0e8336a.png

再查看这个地址

252f8c1f6daa054be963a40d289a0b8a.png

aiyou,bucuoo

这应该就是flag了

1deb593760ffba6452d100d6ac498ea4.png

0x04:

第一次调试native层的东西,还是学到了不少,也遇到了这样那样的小问题,不过还是完成了。

0x05:参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值