2016-02-12 73 views
1

我正在逆向工程一個在GDB中沒有調試符號的c程序。它要求提供一個特定的1-15位數的PIN碼,並告訴你它是否正確。我的目標是找出這個PIN號碼是什麼。有沒有辦法在GDB中查看所有寄存器的特定值?

我很難找到我的針編號猜測與正確的針編號進行比較。我認爲有一種方法可以幫助我找到任何可以將我的猜測加載到註冊表中的地方。

那麼對我的問題,是否有可能檢查並查看某個特定值是否加載到任何寄存器?

例如,我可以通過使用watch $rax == 1234個別寄存器來做到這一點,但我想爲每個寄存器做到這一點。

+1

我不認爲有辦法一次檢查所有通用寄存器的具體值,但你可以像$ rax == 1234 || $ rbx == 1234 || rcx == 1234 || rdx == 1234 ... – Mahouk

回答

1

GDB沒有此功能。

這聽起來很糟糕,因爲如果數字是0-9的數字,你會得到很多誤報,你甚至不能確定它們是如何表示的。

一種更簡單的方法應該是尋找從那裏失敗和跟蹤數據密切相關的銷進入或變更:

  • 如果輸入了錯誤的PIN碼時,控制檯輸出,尋找這個字符串在二進制文件中找到它被引用的地方。
  • 如果這是一個控制檯應用程序,請查找對scanf/printf的引用。
  • 如果它不使用scanf - 例如外部鍵盤,可以使用scanmem等工具查找輸入數字的數量。
+0

謝謝你的迴應。我最終找到了正確的PIN碼。我很難找到我的猜測與正確的引腳相比。我發現檢查寄存器不會起作用,因爲它們一次加載到寄存器1個數字中(每個數字都用一個ASCII十進制值表示)。 我最終找到了解決方案,通過關閉觀察比較語句並檢查這些寄存器中的值是什麼以及它們如何隨着不同的猜測而改變。 – user3225440

相關問題