GDB检查命令混淆

4
这可能听起来很初学,但我真的想了解代码的内部运作方式,而不仅仅停留在更高层次的概念上。
所以我的问题是这样的。我正在阅读《黑客与渗透艺术》,作者正在解释GDB命令,并解释如何检查某个内存地址。
我的问题在于该命令的输出。
(gdb) x/x $eip

我知道x代表十六进制,但我不明白它为什么会显示出这个:

0x8048384  <main+16>:  0x00fc45c7

如果我运行run i r eip,输出应该是0x8048384,那么x/x $eip的两个输出都应该是0x8048384吗?
关于相关主题,类似以下内容有什么用途?
(gbd) x/2x $eip

他说这是为了检查同一地址上的多个单元,但一个地址里怎么可能有多个单元呢?也许我对内存地址背后的概念有所误解。我认为一个内存位置只能容纳一个东西。
如果这似乎是个愚蠢的问题,我再次道歉。我会非常感激帮助和进一步学习的链接。我真的想理解这个。
1个回答

7
在第一个示例(x / x $ eip)中,显示的第一个值(0x8048384)是要执行的下一条指令的地址,而显示的第二个值(0x00fc45c7)是在该地址找到的值,即要执行的下一条指令的二进制值。
至于您的第二个示例(x / 2x $ eip),“多个单元”不在同一个地址上,而是从给定地址开始...例如,在地址0x8048384处显示的第一个值(假设$ eip与您的第一个示例相同)仍将是0x00fc45c7,但下一个值将是下一个地址0x8048388中的任何值。“x / x”非常适合转储一系列地址的值,即数组等的值。

这非常有道理。虽然这本书似乎是以初学者的方式介绍这些概念,但我感觉我需要先阅读一些相关内容。如果需要进一步了解,你能指点我一些阅读材料吗? - Alex_adl04
脑海中没有特别想读的东西...继续阅读你的书,继续尝试各种东西,继续尝试并不断提问。最坏的情况是,退出gdb或特定的shell,并重新打开它以开始全新的操作...Linux使得自己犯错变得更加困难,最多可能会破坏你的gdb会话或混淆你的shell。这很容易修复,而且肯定不会致命。相信我,你不能在不做很多事情的情况下永久地伤害自己。继续尝试! - lornix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接