2015 移动安全挑战赛 1.22-1.25 前言 2个多月前,也就是11月中旬去深圳玩了一趟,在同学的带领下,花了2天在腾讯内部感受他们的环境和工作氛围,加班的很多,感觉他也确实很幸苦。回来之后,第一天晚上没睡着,感觉别人都在玩命,而我却在潇洒。于是便买了一本移动安全的书,扎扎实实得学了两个月。尽管挫折很多,多次想放弃,在此就要谢谢我的小伙伴们了,因为之前PC端朋友们的鼓励和移动端朋友们耐心解答我这个新手的问题,我坚持了下来。参加这次比赛在我看来我只是抱着一种学习的心态来看看,多亏有上天眷顾,幸运获奖。下面就分享下比赛中题目的解题思路。 第一题: 1.Apktools反编译之后定位到MainActivity中的onCreate函数,发现关键跳: 2.往上看发现了: v4 v2 v5 都是Log出来的,打开DDMS。输入123看log: 发现enPassword为123对应的加密字符串,pw其实就是正确的密码了。 为了找到pw所对应的字符串作为输入,输入0123456789ABCDEF再次log出来。 对照可以知道,只要输入“581026”对应的就是正确的pw了。 第二题: 1.Apktools反编译之后可看到: 关键函数就是这个SecurityCheck了,这个函数在so里面。 2.去反调试 由于这个程序用 IDA附加后跑根本跑不起来,所以需要跟一下流程。 在Jni_Onload函数下好断点,动态调试。 分析后发现nop这个call可以过反调试: 3.在SecurityCheck函数段首F2,输入“123456”触发断点,F8单步分析到这里;
R2存放正确的password: R0为输入的password: 然后下面CMP R3,R1 之后就是关键跳了。 看到R2前面的提示,很明显了。 输入“aiyou,bucuoo” 提示密码正确,第二题就是这样了。 第三题: 1.Apktools反编译,发现内容加载了一个so。应该是早期Ali的一个壳子。 2.IDA附加跑程序,发现会退出,又是反调试,那就需要去掉反调试。 到了第三题,为了保险起见,直接在ptrace下断点好了,IDA载入libmobisec.so 找到ptrace函数的引用: 在2个函数段首下好断点。IDA附加: 断下来首先停在这个函数: 找到段尾的出栈操作的Hex 把第二句替换掉,实际上也就达到了nop掉整个call的效果。但是这个函数nop掉会出错,可能还与其他call有关联,毕竟是一个大call。
接着试一下另外一个函数,F9就会断在第二个函数了如图: 把第二行改成让它直接POP出去如下: 然后程序就能跑起来了,直接F9跑起来,这个时候代码已经全部解密了。 在16进制窗口找到: 这是1个odex的头,我们从dex.035开始往后翻,找到一段全为0的区域(因为区块中间都是会有一大段00 00 00,就把前面的dump下来,如果不行,继续往下翻,这样就可以把解密的dex dump出来了。再用baksmali和smali进行转换一下,就可以得到 脱壳后的dex原始文件了。用JEB查看:
如图所示,重点就是b类和e类了。 然后就是几种思路了: 1.把anti-debug代码去掉重打包。 2.Hook anti-debug的函数,让它们“闲着”。 3.用其他绕过去 把脱壳后的dex重打包签名,安装好,准备动态调试。 主要方法就是JEB里面静态分析与动态调试smali代码相结合的方式。 首先静态分析可以知道一下内容:
因为我比较懒,就用Eclipse来调试Smali了,走了几遍,发现了SendEmptyMessage后面的参数为0才是正确的。所以往下找分析如下:
s5的算法: 31x+y=3618 x+y=168 解出来就是s5 然后在Eclipse的变量窗口中找到v_51的值为“7e1p”: 所以“s57e1p”就是正确的字符串密码了。 在e类的table中一一对应好,所以真正的密码为: “... _____ ____. . ..___ .__.”。
写得比较简洁,过程还是比较长的,最后的算法要绕过层层判断才能深入内部,得到7e1p的值。 最后感谢各位一起玩耍的小伙伴了,有你们世界真精彩!剩下的就是做世间最难做的一件事了----“坚持”,再坚持2个月就奖自己一台电脑好了。加油加油,等着好了。 Ericky 2015.1.26 |