在之前的 iOS安全攻防(七):Hack實戰(zhàn)——解除支付寶app手勢解鎖錯誤次數(shù)限制中,留了一個問題,就是如何破解手勢密碼。
方法不唯一,本文介紹如何利用 gdb 分析破解 App 。
當沒有程序源代碼的情況下,我們如何利用 gdb 呢?
為了確定應該如何設置斷點,不得不反匯編程序來作為參考了。
在前面的文章提到過,支付寶 app 的手勢密碼校驗處理非常嚴謹,沒有拋出 BOOL 判斷的方法讓我們可以直接修改返回值跳過驗證,而是將全部操作封在了
-(void)gestureInputView:(id)view didFinishWithPassword:(id)password;
于是,我反匯編了支付寶 app ,找到手勢密碼解鎖的相關代碼片段:
http://wiki.jikexueyuan.com/project/ios-security-defense/images/guesture-password.png" alt="guesture-password" />
紅色箭頭標注的地方,讓人欣喜,這將是我們斷點位置的最好選擇。
首先,查看一下相關程序段符號表:
nm Portal | grep -i gestureinputview
得到結果:
nm Portal | grep -i getpassword
得到結果:
http://wiki.jikexueyuan.com/project/ios-security-defense/images/guesture-password2.png" alt="guesture-password2" />
確定了了關鍵函數(shù)的輸出符號。
啟動支付寶 app ,并 gdb 該進程:
gdb -q -p 671
在上述兩個函數(shù)位置設置斷點: http://wiki.jikexueyuan.com/project/ios-security-defense/images/guesture-password3.png" alt="guesture-password3" />
可以通過 info breakpoints 查看斷點: http://wiki.jikexueyuan.com/project/ios-security-defense/images/guesture-password4.png" alt="guesture-password4" />
continue 到 getPassword 位置,打印函數(shù)棧: http://wiki.jikexueyuan.com/project/ios-security-defense/images/guesture-password5.png" alt="guesture-password5" />
我們可以確定了 getPassword 的返回地址是 0x00becb36 , 對該地址加斷點:
b * 0xbecb36
然后繼續(xù) continue ,程序將卡在上面的斷點上。
從上面的反匯編代碼,我們可以知道,用戶輸入的密碼為存在 r8 上,原始密碼為存在 r0 上,我們直接打印出這兩個寄存器的值:
http://wiki.jikexueyuan.com/project/ios-security-defense/images/guesture-password6.png" alt="guesture-password6" />
正確密碼是個 “Z” 手勢圖畫,而當前輸入為 “一” 手勢圖畫。 可以得出結論,支付寶 app 的手勢密碼和大多數(shù) app 一樣,手勢密碼格式是字符串,9 個點分別對應字符 123456789 。