-
-
[原创]《2015移动安全挑战赛》答题思路
-
发表于: 2015-1-26 18:46 3460
-
环境+工具:
1. nexus5 4.4.2 已root
2. win7 64位
3. android sdk+ndk
4. ida6.5+ida6.6
5. UE
6. eclipse
7. AXMLPrinter2.jar
8. jdb
1.
答案:581026
解题思路:
1. 安装apk,操作一会,没有异常
2. 解压apk,普通apk,没有so库
3. 分析AndroidManifest.xml:用AXMLPrinter2.jar逆向出AndroidManifest.org.xml,可知包名com.example.simpleencryption
入口Activity是MainActivity,没有异常
4. 分析classes.dex:用ida打开classes.dex文件,找到MainActivity相关的方法,发现有onClick,没有加密,简单的控制流。
看到有Log.i函数,TAG是"lil",用adb logcat -s lil查看日志:
很明显,table就是字典,解压密码是"义弓么丸广之",输入密码是"丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰",
经过多次输入查看日志,可得到"义弓么丸广之"=581026
总结:分析apk入门级题目,考察android的基本知识:包括apk包了解,Activity的了解,dex的了解。
2. 答案:aiyou,bucuoo
解题思路:
1. 前略,需要动态调试
2. 启动apk后,直接用ida attach进程,进程会强制退出,估计有反调试。
3. 在启动apk过程中,加载so时后,调用JNI_OnLoad前(启动反调试模块前)下断点:
1. 调试模式启动apk,启动后apk会等到调试器连接:adb shell am start -D com.yaotong.crackme/.MainActivity
2. 查看apk调试的端口1:adb jdwp
3. 映射端口:adb forward tcp:端口2 jdwp:端口1
4. attach进程:ida attach到apk,在linker中加载so库处下断点(在nexus5中,linker的偏移0xf30)
5. 启动apk:jdb -connect com.sun.jdi.SocketAttach:port=端口2,hostname=localhost
6. 启动后,会断在linker加载libcrachme.so库处,加载完so,在libcrachme.so内存空间中找到JNI_OnLoad下断点
4. 调试JNI_OnLoad过程中,发现调用pthread_create创建thread1,创建thread1的入口函数就是反调试模块的代码,
针对这种反调试的代码,最简单的作法就是不调用pthread_create,不创建监控进程(ida动态调用时用Set IP的方法)。
跑起来后,apk不会强制退出了。(pthread_create的偏移为0x1C58)
5. 在Java_com_yaotong_crackme_MainActivity_securityCheck下断点,界面上随便输入EEEEEEEEEEEE,点击输入密码就能断下来了,
Java_com_yaotong_crackme_MainActivity_securityCheck函数的逻辑也很简单,输出一个"SecurityCheck Started..." logcat,
然后就通过循环来比较字符串了。
总结:动态调试apk入门组题目,考察Android中Jni调用流程,基本的动态调试能力,反调试也算是一个考点吧,虽然比较简单。
so库中用到的标准库函数都是动态调用的,字符串也是加密过的。
附:linker文件,反调试代码demo main.c
3. 答案:
解题思路:
1. 前略,lib目录下有3个so,
1. libmobisecy.so是真正的dex(classes.dex只是个sub)
2. libmobisecz.so是估计是解密字典,也有可能是加密过的核心代码
3. libmobisec.so是Jni中加载的so
2. logcat中可以得到2个信息:
1. x in JNI_Onload 就是在JNI_Onload
2. debug in... 提示,可能是关键位置
3. 跟第一样的启动调试,从JNI_OnLoad函数开始分析
4. 可以尝试直接在liblog.so中的__android_log_printf断点,但是在logcat2之前会遇到反调试的代码
5. JNI_OnLoad中会进入libmobisec.so+0x23358偏移的函数,函数会启动一个反调试进程,框架跟第2题差不多,
但是其中插入了ptrace(0,0,0)代码
6. ..
总结:动态调试apk,可能是第2题反调试框架上增加难度,包括增加控制流代码,加入ptrace(0,0,0)等等,有待继续研究。
1. nexus5 4.4.2 已root
2. win7 64位
3. android sdk+ndk
4. ida6.5+ida6.6
5. UE
6. eclipse
7. AXMLPrinter2.jar
8. jdb
1.
答案:581026
解题思路:
1. 安装apk,操作一会,没有异常
2. 解压apk,普通apk,没有so库
3. 分析AndroidManifest.xml:用AXMLPrinter2.jar逆向出AndroidManifest.org.xml,可知包名com.example.simpleencryption
入口Activity是MainActivity,没有异常
4. 分析classes.dex:用ida打开classes.dex文件,找到MainActivity相关的方法,发现有onClick,没有加密,简单的控制流。
看到有Log.i函数,TAG是"lil",用adb logcat -s lil查看日志:
很明显,table就是字典,解压密码是"义弓么丸广之",输入密码是"丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰丰",
经过多次输入查看日志,可得到"义弓么丸广之"=581026
总结:分析apk入门级题目,考察android的基本知识:包括apk包了解,Activity的了解,dex的了解。
2. 答案:aiyou,bucuoo
解题思路:
1. 前略,需要动态调试
2. 启动apk后,直接用ida attach进程,进程会强制退出,估计有反调试。
3. 在启动apk过程中,加载so时后,调用JNI_OnLoad前(启动反调试模块前)下断点:
1. 调试模式启动apk,启动后apk会等到调试器连接:adb shell am start -D com.yaotong.crackme/.MainActivity
2. 查看apk调试的端口1:adb jdwp
3. 映射端口:adb forward tcp:端口2 jdwp:端口1
4. attach进程:ida attach到apk,在linker中加载so库处下断点(在nexus5中,linker的偏移0xf30)
5. 启动apk:jdb -connect com.sun.jdi.SocketAttach:port=端口2,hostname=localhost
6. 启动后,会断在linker加载libcrachme.so库处,加载完so,在libcrachme.so内存空间中找到JNI_OnLoad下断点
4. 调试JNI_OnLoad过程中,发现调用pthread_create创建thread1,创建thread1的入口函数就是反调试模块的代码,
针对这种反调试的代码,最简单的作法就是不调用pthread_create,不创建监控进程(ida动态调用时用Set IP的方法)。
跑起来后,apk不会强制退出了。(pthread_create的偏移为0x1C58)
5. 在Java_com_yaotong_crackme_MainActivity_securityCheck下断点,界面上随便输入EEEEEEEEEEEE,点击输入密码就能断下来了,
Java_com_yaotong_crackme_MainActivity_securityCheck函数的逻辑也很简单,输出一个"SecurityCheck Started..." logcat,
然后就通过循环来比较字符串了。
总结:动态调试apk入门组题目,考察Android中Jni调用流程,基本的动态调试能力,反调试也算是一个考点吧,虽然比较简单。
so库中用到的标准库函数都是动态调用的,字符串也是加密过的。
附:linker文件,反调试代码demo main.c
3. 答案:
解题思路:
1. 前略,lib目录下有3个so,
1. libmobisecy.so是真正的dex(classes.dex只是个sub)
2. libmobisecz.so是估计是解密字典,也有可能是加密过的核心代码
3. libmobisec.so是Jni中加载的so
2. logcat中可以得到2个信息:
1. x in JNI_Onload 就是在JNI_Onload
2. debug in... 提示,可能是关键位置
3. 跟第一样的启动调试,从JNI_OnLoad函数开始分析
4. 可以尝试直接在liblog.so中的__android_log_printf断点,但是在logcat2之前会遇到反调试的代码
5. JNI_OnLoad中会进入libmobisec.so+0x23358偏移的函数,函数会启动一个反调试进程,框架跟第2题差不多,
但是其中插入了ptrace(0,0,0)代码
6. ..
总结:动态调试apk,可能是第2题反调试框架上增加难度,包括增加控制流代码,加入ptrace(0,0,0)等等,有待继续研究。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: