【问题标题】:Is there a way to watch all registers for a specific value in GDB?有没有办法在 GDB 中查看所有寄存器的特定值?
【发布时间】:2016-05-23 02:53:51
【问题描述】:

我正在对一个在 GDB 中没有调试符号的 c 程序进行逆向工程。它要求输入一个特定的 1-15 位密码,并告诉您它是否正确。我的目标是找出这个密码是什么。

我很难找到我猜测的密码与正确密码的比较。我认为会有所帮助的一种方法是找到将我的猜测加载到寄存器中的任何地方。

那么关于我的问题,是否可以检查并查看是否将特定值加载到任何寄存器中?

例如,我可以使用 watch $rax == 1234 对单个寄存器执行此操作,但我想对每个寄存器执行此操作。

【问题讨论】:

  • 我不认为有一种方法可以同时检查所有通用寄存器的特定值,但你可以像 $rax == 1234 || 这样组合$rbx == 1234 || rcx == 1234 || rdx == 1234 ...

标签: debugging gdb reverse-engineering


【解决方案1】:

GDB 没有这个功能。

这听起来不太好,因为如果数字是 0-9 之间的数字,你会得到很多误报,你甚至无法确定它们是如何表示的。

一种更简单的方法应该是查找与输入或失败的 pin 密切相关的更改并从那里跟踪数据:

  • 如果输入错误的 pin 时有控制台输出,请在二进制文件中查找此字符串并找到它的引用位置。
  • 如果这是一个控制台应用程序,请查找对 scanf / printf 的引用。
  • 如果不使用 scanf - 例如外部键盘,您可以使用 scanmem 等工具查找输入的位数。

【讨论】:

  • 感谢您的回复。我最终找到了正确的密码。我很难找到我的猜测与正确的引脚进行比较的位置。我发现检查寄存器无论如何都不会起作用,因为它们一次被加载到寄存器中(每个数字都由它的 ASCII 十进制值表示)。我最终通过关闭观察比较语句并检查这些寄存器中的值是什么以及它们如何随着不同的猜测而变化来找到解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多