返回首页 iOS 安全攻防

Hack 实战——探究支付宝 App 手势密码

在之前的 iOS安全攻防(七):Hack实战——解除支付宝app手势解锁错误次数限制中,留了一个问题,就是如何破解手势密码。

方法不唯一,本文介绍如何利用 gdb 分析破解 App 。

当没有程序源代码的情况下,我们如何利用 gdb 呢?

为了确定应该如何设置断点,不得不反汇编程序来作为参考了。

在前面的文章提到过,支付宝 app 的手势密码校验处理非常严谨,没有抛出 BOOL 判断的方法让我们可以直接修改返回值跳过验证,而是将全部操作封在了

-(void)gestureInputView:(id)view didFinishWithPassword:(id)password; 

于是,我反汇编了支付宝 app ,找到手势密码解锁的相关代码片段:

guesture-password

红色箭头标注的地方,让人欣喜,这将是我们断点位置的最好选择。

首先,查看一下相关程序段符号表:

nm Portal | grep -i gestureinputview

得到结果:

nm Portal | grep -i getpassword

得到结果:

guesture-password2

确定了了关键函数的输出符号。

启动支付宝 app ,并 gdb 该进程: gdb -q -p 671

在上述两个函数位置设置断点: guesture-password3

可以通过 info breakpoints 查看断点: guesture-password4

continue 到 getPassword 位置,打印函数栈: guesture-password5

我们可以确定了 getPassword 的返回地址是 0x00becb36 , 对该地址加断点:

b * 0xbecb36

然后继续 continue ,程序将卡在上面的断点上。

从上面的反汇编代码,我们可以知道,用户输入的密码为存在 r8 上,原始密码为存在 r0 上,我们直接打印出这两个寄存器的值:

guesture-password6

正确密码是个 “Z” 手势图画,而当前输入为 “一” 手势图画。 可以得出结论,支付宝 app 的手势密码和大多数 app 一样,手势密码格式是字符串,9 个点分别对应字符 123456789 。