所以我试图调试一些代码,我所拥有的只是可执行文件.我知道寄存器包含需要知道的地址.有没有办法可以打印出从该地址开始到给定长度的十六进制值?
我尝试过的事情:
x/s $ebp
p (char) ($ebp)
p (char) (*ebp >> 4 )
p (char)*(%ebp 4 )
p $($ebp)
p $(%ebp + $0x1)
Run Code Online (Sandbox Code Playgroud)
普通指针算术不适用于寄存器吗?它说"历史是空的"是什么意思
dus*_*uff 10
该x
命令将是在内存中显示值的最简单方法.试试,例如:
(gdb) x/32b $ebp
Run Code Online (Sandbox Code Playgroud)
如果这不起作用(特别是如果您收到"值无法转换为整数"的错误),您可能正在调试64位可执行文件.x86-64寄存器有不同的名称; 使用$rbp
来代替.
x
命令中斜杠后面的字符控制显示多少个值,以及使用的格式.x/s
例如,将尝试从该地址读取字符串.如果你不使用任何东西,gdb将使用你上次使用的任何东西.
虽然没有必要回答您的问题,但我已经修复了您尝试运行的其他一些命令:
p *((char *) $ebp) <- treat $ebp as a character pointer and display what it points to
p *((char *) $ebp + 4) <- with an offset
p ((char *) $ebp)[4] <- same thing as above, except using array syntax
Run Code Online (Sandbox Code Playgroud)
$
只有在引用寄存器或gdb变量时才需要该字符.你不需要任何其他东西.