2015移动安全挑战赛是由看雪和阿里巴巴联合举办的面向移动安全爱好者的比赛,感谢逆向工程界的前辈看雪论坛和非常重视技术积累的阿里巴巴为推动移动安全在国内的发展和普及所作出的贡献!这次实战的目的,是带大家一起做一做这次比赛的第1个iOS题,感受一下iOS逆向工程在比赛实战中的运用,如果你有更好的解题思路,欢迎参与讨论
ipa下载地址:AliCrackMe
下载app安装成功后界面如下
在输入框随意输入字符串,单击进入按钮,弹出密码错误提示框,好的,明白了题意即为截获正确密码
密码错误提示一定是由代码控制的,既然弹出了错误提示,说明在弹出提示之前,一定有字符串匹配(isEqualToString:),验证输入的字符串是否相等。打开终端, 劫持该进程
cycript -p level1
[[UIApp keyWindow] recursiveDescription]
ok,劫持成功后,根据终端打印的日志,找到"进入"按钮
signBtn = #0x17518230
signBtn.backgroundColor = [UIColor blueColor]
按钮被设置成了蓝色背景
继续操作
[signBtn allTargets]
[NSSet setWithArray:@[#"<ViewController:0x175b6b70>"]]]
[signBtn allControlEvents]
64
[signBtn actionsForTarget:#0x175b6b70 forControlEvent:64]
ok, "进入"按钮的相应函数是[ViewController onClick],开始分析汇编代码。
从[ViewController onClick]出发,找到答案,[ViewController onClick]的汇编执行流程如下图所示
很明显,这段汇编代码从textField里读text,转换成UTF8String之后,和某个值作判断,并根据判断结果跳转,这一现象跟我们上一节作出的预测不谋而合
在这段代码的开头下个断点,然后单步执行,看看每个objc_msgSend都做了什么操作,先用debugserver挂载level1:
挂载时间会比较长,挂载成功后用LLDB连过去(参考沙梓社):
在0000B76A下断点(这些操作也都在书上重复过无数遍了,下面还是以码代字):
点击按钮,触发断点:
看到了一个可疑的字符串“Sp4rkDr0idKit”,你应该已经猜到了,它就是我们的答案,知其然,还要知其所以然,我们继续分析,看看正确的判断逻辑是怎样的。
分析判断逻辑,顺着上面的代码,接着分析:
值得一提的是,这个判断逻辑有一个bug——即我们输入的字符串,只需要含有“Sp4rkDr0idKit”这个前缀就可以了,而不用全文匹配这个字符串,如图所示:
(本文部分图片引用沙梓社论坛)