在之前的 iOS安全攻防(七):Hack實戰——解除支付寶app手勢解鎖錯誤次數限制 中,留了一個問題,就是如何破解手勢密碼。
方法不唯一,本文介紹如何利用gdb分析破解app。
當沒有程式原始碼的情況下,我們如何利用gdb呢?
為了確定應該如何設定斷點,不得不反彙編程式來作為參考了。
在前面的文章提到過,支付寶app的手勢密碼校驗處理非常嚴謹,沒有丟擲BOOL判斷的方法讓我們可以直接修改返回值跳過驗證,而是將全部操作封在了
1 |
-(void)gestureInputView:(id)view didFinishWithPassword:(id)password; |
於是,我反彙編了支付寶app,找到手勢密碼解鎖的相關程式碼片段:
紅色箭頭標註的地方,讓人欣喜,這將是我們斷點位置的最好選擇。
首先,檢視一下相關程式段符號表:
1 |
nm Portal | grep -i gestureinputview |
得到結果:
1 |
nm Portal | grep -i getpassword |
得到結果:
確定了了關鍵函式的輸出符號。
啟動支付寶app,並gdb該程式:
1 |
gdb -q -p 671 |
在上述兩個函式位置設定斷點:
可以通過info breakpoints 檢視斷點:
continue到 getPassword 位置,列印函式棧:
我們可以確定了 getPassword 的返回地址是 0x00becb36 , 對該地址加斷點:
1 |
b * 0xbecb36 |
然後繼續continue,程式將卡在上面的斷點上。
從上面的反彙編程式碼,我們可以知道,使用者輸入的密碼為存在r8上,原始密碼為存在r0上,我們直接列印出這兩個暫存器的值:
正確密碼是個“Z”手勢圖畫,而當前輸入為“一”手勢圖畫。
可以得出結論,支付寶app的手勢密碼和大多數app一樣,手勢密碼格式是字串,9個點分別對應字元123456789。