小编偶然发现在google云端网盘上Mobile Challenges有各个网友上传的关于移动安全的题目https://drive.google.com/folderview?id=0B7rtSe_PH_fTWDQ0RC1DeWVoVUE&usp=sharing,有需要的可下载。
还收集了部分竞赛中一些牛人写的解题思路,下载网址如下:http://pan.baidu.com/s/1ntrDgc5 密码:byis
以下是小编参加2015阿里组织的移动安全挑战赛时写的第二题解题思路,那时刚学android逆向,比较菜,各位大神请绕过~
运行程序后没有log信息,又看了下源码,它加载了crackme.so动态链接库,调用了其中的函数securityCheck(str),根据该函数的返回值(0或1)来判断是否输入正确。
首先进行静态分析crackme.so,载入IDA,查看securityCheck函数的源码:得知字符串v6所存的就是密码。查看偏移628c处所存的字符串,是“wojiushidaan”。输入看看,错误。好吧,我也觉得没有那么简单。估计是程序运行后把字符串改了。
刚学了android动态调试(http://www.52pojie.cn/thread-293648-1-1.html),就试试看,在JNI_OnLoad函数上下断点。
(1) 执行android_server:adb shell /data/local/tmp/android_server
(2) 端口转发adb forward tcp:23946 tcp:23946
(3) 调试模式启动程序adb shell am start -D -n com.yaotong.crackme/.MainActivity
(4) IDA附加
(5) 设置调试选项
(6) F9运行
(7) 执行jdb -connectcom.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
(8) 静态找到目标函数对应所在模块的偏移地址
JNI_OnLoad函数:0x00001B9C
Java_com_yaotong_crackme_MainActivity_securityCheck:0x000011A8
aWojiushidaan:0x00004450
(9) Ctrl+S找到libcrackme.so基地址0x4924C000,分别与上述三个地址相加得到最终地址。(10) G跳转至两个函数地址,然后下断点
(11) F9运行
(12) 断下,进行单步调试F8,同时查看0x49250450处的字符串。
当单步调试JNI_OnLoad函数到某一步时,发现字符串变为“aiyou,bucuoo”。
结果:aiyou,bucuoo
dump内存。
程序运行在手机上(经测试,模拟器上貌似不行)。
通过dd命令,将内存里的数据拷贝出来。
dd if=/proc/6821/mem of=/sdcard/mem bs=1skip= 1074085888 count=20480
dd if=/proc/6821/mem of=/sdcard/mem bs=1skip=1336799232 count=28672
mem文件用IDA打开,查看0x00004450处的值。
执行android_server:adb shell /data/local/tmp/android_server
端口转发adb forward tcp:23946 tcp:23946
在模拟器上运行程序
ps找到程序pid
命令:kill -19 <pid> 可以让进程暂停
IDA附加
libcrackme.so基址为0x4914C000
aWojiushidaan:0x00004450
查看0x49150450处的内存
第三题的解决方案:
(1) Indroid(LoCCS实验室开发的工具)貌似要在google手机编译后才能运行成功;
(2) Zjdroid修复一下再内存dump
(3) 过反调试 j_j_ptrace、dump内存、修复dex、修复bakesmali、修复dextojar 或 JEB查看,最后应用源代码分析
最后给大家推荐一些优秀站点:
[1] http://bbs.pediy.com/
[2] http://www.52pojie.cn/
[3] http://blog.dutsec.cn/
[4] http://l-team.org/
[5] http://le4f.net/