显示在给定地址gdb找到的值

问题描述 投票:0回答:2

我正在 gdb 中调试二进制文件。它是由 gcc 在 Intel IA-32 上编译的 C 代码。我从

objdump
检索了此输出。我对这里的最后一行最感兴趣:

08048d9e <func_1>
8048d9e:    55                      push   %ebp
8048d9f:    89 e5                   mov    %esp,%ebp
8048da1:    83 ec 18                sub    $0x18,%esp
8048da4:    c7 44 24 04 88 99 04    movl   $0x8049988,0x4(%esp)
8048dab:    08 
8048dac:    8b 45 08                mov    0x8(%ebp),%eax
8048daf:    89 04 24                mov    %eax,(%esp)
8048db2:    e8 54 01 00 00          call   8048f0b <strings_not_equal>

我相信最后一行将比较在指定地址找到的值:

8048f0b
。我尝试:

(gdb) x 0x8048f0b

并收到:

0x8048f0b <strings_not_equal>:  0x57e58955

我是否错误地解释了程序集?这是读取 gdb 中地址值的正确方法吗?我有点期待找到一个更 ASCII 友好的十六进制值。我有兴趣找到与之比较的存储字符串值。

您是否有最喜欢的 GUI 工具用于此类调试?我一直在考虑尝试ddd。我想找到一种更简单的调试方法。

c linux assembly gdb x86
2个回答
39
投票

您正确读取了内存地址

0x8048f0b
处的值,但是
call   8048f0b <strings_not_equal>
行表示该地址是函数的开始位置(称为
strings_not_equal()
)。你不会期望它是 ASCII - 你会期望它是更多的机器代码。

如果您正在寻找

strings_not_equal()
的函数参数,这些参数将被推入堆栈。第一个参数是从
0x8(%ebp)
复制的,它是
func1()
的第一个参数。第二个参数是
$0x8049988
,大概是字符串的地址。

如果要将地址内容打印为字符串,可以使用

x/s
:

x/s 0x8049988

0
投票

不可能,你在研究二元炸弹吗?我很好奇你上的是哪所大学,学的是什么课程!

© www.soinside.com 2019 - 2024. All rights reserved.