在之前的 iOS安全攻防(七):Hack实战——解除支付宝app手势解锁错误次数限制中,留了一个问题,就是如何破解手势密码。
方法不唯一,本文介绍如何利用 gdb 分析破解 App 。
当没有程序源代码的情况下,我们如何利用 gdb 呢?
为了确定应该如何设置断点,不得不反汇编程序来作为参考了。
在前面的文章提到过,支付宝 app 的手势密码校验处理非常严谨,没有抛出 BOOL 判断的方法让我们可以直接修改返回值跳过验证,而是将全部操作封在了
-(void)gestureInputView:(id)view didFinishWithPassword:(id)password;
于是,我反汇编了支付宝 app ,找到手势密码解锁的相关代码片段:
红色箭头标注的地方,让人欣喜,这将是我们断点位置的最好选择。
首先,查看一下相关程序段符号表:
nm Portal | grep -i gestureinputview
得到结果:
nm Portal | grep -i getpassword
得到结果:
确定了了关键函数的输出符号。
启动支付宝 app ,并 gdb 该进程: gdb -q -p 671
在上述两个函数位置设置断点:
可以通过 info breakpoints 查看断点:
continue 到 getPassword 位置,打印函数栈:
我们可以确定了 getPassword 的返回地址是 0x00becb36 , 对该地址加断点:
b * 0xbecb36
然后继续 continue ,程序将卡在上面的断点上。
从上面的反汇编代码,我们可以知道,用户输入的密码为存在 r8 上,原始密码为存在 r0 上,我们直接打印出这两个寄存器的值:
正确密码是个 “Z” 手势图画,而当前输入为 “一” 手势图画。 可以得出结论,支付宝 app 的手势密码和大多数 app 一样,手势密码格式是字符串,9 个点分别对应字符 123456789 。