阿里移动安全挑战赛第二题研究小结
1、取巧的方法
因为不太会看汇编指令,所以看了别人的解题思路后,自己想了个取巧的方法。o(╯□╰)o
之前学习的过程中学会了不少指令,例如strings,列出文件中所有字符串。突然想起来可以导出apk运行时so文件的内存(其实也是现学的- -'),
验证了一次后被比较的字符串就存放在内存中了,于是使用dd命令将内容导入SD卡:
root@android:/ # dd if=/proc/2829/mem of=/sdcard/hah.mem bs=1 skip=1750364160 count=28672
对小白来说,查pid啊,dd命令的格式啊都是现查的。虽然很白痴,但是用几次就熟悉了,慢慢积累。
skip是so文件的起始位置,count是拷贝的blocks 个块,其实拷贝so文件的起始位置之差最好吧。
然后使用strings命令:
strings -n 4 -o hah.mem | grep -v _ | grep -v .so | grep -v /
打印出的字符串如下,附带了所在位置:
3577 jolin 3702 free 3707 dlsym 3715 malloc 4321 raise 4702 abort 4732 memcpy 13754 u,bucuoo 15477 Qffffff 42120 aiyou,bucuoo 42170 s!#L 42226 9X,+(X=!) 42247 cOXt 42263 .6gq 42356 LNAt 42404 9HbB 42420 BMAE 42425 3:*8(-& 42435 "@%%7)B 52120 wojiushidaan 52170 s!#L 52226 9X,+(X=!) 52247 cOXt 52263 .6gq 52356 LNAt 52404 9HbB 52420 BMAE 52425 3:*8(-& 52435 "@%%7)B 57722 !@Kx'@e 57736 $@=P 57756 $@@a%@ 61224 XO%@9 61242 %@}5&@ 61252 %@$b%@ 61271 O%@|`%@ 61314 kill 61321 %s %d 61327 dlsym 61335 fopen 61343 fgets 61351 sleep 61357 getpid 61366 strstr 61375 sscanf 61404 yaotong 61414 sprintf 61424 lrand48 61434 mprotect 61445 TracerPid 61457 cacheflush 61554 SecurityCheck Started...
当然,是出了答案才去研究的,所以过滤的“_”,“/”,“.so”字符串可能并不具有通用性。
用肉眼看,以及对密码内容可能性的猜解,即使挨个试也不算太耗时间。嗯嗯。就是这么简单粗暴。
2、貌似冠军给出的另类解法:
参考:http://drops.wooyun.org/tips/5409
修改so文件中的比较部分,利用之前的日志打印函数,将被比较的字符串打印出来。自己试了下,可行,也简单高效。
3、某师兄写的解题思路,绕过调试,然后改so文件。由于刚开始连ida如何attach 手机apk都不懂,后来attach上了因为反调试也没能正常加载。
所以只是看了看。日后学得更多了,再回头研究。
参考:http://secauo.com/2015-Mobile-Security-Challenge-2.html
4、某同仁提供的思路,使用adbi框架,hook程序读取状态信息的操作函数fopen,这样就能正常attach到程序上。
其实对于小白来说,接受一种新的解题思路,比做出来题目还要有意义。所以自己编译了下adbi框架(幸好之前装了ndk编译环境T.T)。
基本学会了这个框架的使用方法,看了看原理,内联hook,虽然到现在还是云里雾里的,至少会简单使用了。
因为至今还未attach到程序上过,也不知道attach之后如何操作、查看变量内容。但至少通过这一研究过程学习咯:
ida attach程序的方法
修改so文件的方法(使用010或ida)
adbi框架的使用方法
strings指令的使用
dd命令的使用
查看pid的方法
虽然一直以来都没真正接触过逆向,相信慢慢的,也会越懂越多,越深入的。加油↖(^ω^)↗