这听起来可能令人难以置信,但我真的想了解代码的内部工作原理,而不仅仅是坚持更高层次的概念。

所以我的问题是这个。我目前正在阅读“黑客和利用的艺术”,当作者在解释 GDB 命令时,他来解释如何检查某个内存地址。

我的问题是命令的输出

(gdb) x/x $eip

我知道 x 代表十六进制,我不明白的是为什么它会显示这个:
0x8048384  <main+16>:  0x00fc45c7

如果我 run i r eip 的输出是 0x8048384,那么 x/x $eip 的两个输出不应该都是
0x8048384?

在相关主题上,诸如此类的目的是什么
(gbd) x/2x $eip

他说是检查同一个地址的多个单元,一个地址怎么会有多个单元?也许我误解了内存地址背后的概念。我认为一个内存位置只能容纳一件事。

如果这似乎是一个愚蠢的问题,我再次道歉。我很乐意提供帮助和进一步研究的链接。我真的很想了解这一点。

最佳答案

在第一个例子(x/x $eip)中,显示的第一个值(0x8048384)是要执行的下一条指令的地址,而显示的第二个值(0x00fc45c7)是在该地址找到的值,即二进制值下一条要执行的指令。

至于你的第二个例子(x/2x $eip),“多个单位”不在相同的地址,而是在给定的地址开始......例如,显示的第一个值(假设 $eip 与您的第一个示例)在地址 0x8048384 处仍为 0x00fc45c7,但下一个值将是下一个地址 0x8048388 中的任何值。 “x/x”非常适合转储地址范围的值,即数组中的值等。

关于c - GDB 检查命令混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23990848/

10-13 07:47