2016-02-12 71 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

相关问题