这听起来可能令人难以置信,但我真的想了解代码的内部工作原理,而不仅仅是坚持更高层次的概念。
所以我的问题是这个。我目前正在阅读“黑客和利用的艺术”,当作者在解释 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/