GDB检查命令混乱

时间:2014-06-02 09:04:39

标签: c assembly gdb

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

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

我的问题是输出命令

(gdb) x/x $eip

我理解x代表十六进制,我不明白为什么它显示了这个:

0x8048384  <main+16>:  0x00fc45c7

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

在相关主题上,

之类的目的是什么
(gbd) x/2x $eip

他说要检查同一地址的多个单位,如何在一个地址中有多个单位?也许我误解了内存地址背后的概念。我认为内存位置只能容纳一件事。

如果这看起来像一个愚蠢的问题,我再次道歉。我很乐意感谢帮助和进一步学习的链接。我真的很想了解这一点。

1 个答案:

答案 0 :(得分:3)

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

关于你的第二个例子(x / 2x $ eip),&#34;多个单位&#34;不是在SAME地址,而是在给定地址开始...例如,地址0x8048384处显示的第一个值(假设$ eip与第一个示例中的相同)仍然是0x00fc45c7,但下一个值将是无论下一个地址是什么值,0x8048388。 &#34; X / X&#34;非常适合转储RANGE地址的值,即数组中的值等。