【问题标题】:Display value found at given address gdb显示在给定地址 gdb 找到的值
【发布时间】:2013-01-07 18:11:54
【问题描述】:

我在 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


    【解决方案1】:

    您正在正确读取内存地址0x8048f0b 处的值,但call 8048f0b &lt;strings_not_equal&gt; 行表明该地址是函数的开始(称为strings_not_equal())。你不会期望它是 ASCII - 你会期望它是更多的机器代码。

    如果您正在寻找strings_not_equal() 的函数参数,它们将被压入堆栈。第一个参数从0x8(%ebp) 复制而来,这是func1() 的第一个参数。第二个参数是$0x8049988,大概是一个字符串的地址。

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

    x/s 0x8049988
    

    【讨论】:

    • 所以在phase_1 中的第一个参数:0x8(%ebp) 存储在堆栈中的%eax。这也将是传递给strings_not_equal 的参数?你怎么知道strings_not_equal 的第二个参数是$0x8049988?是不是因为写给0x4(%esp)
    • 所以x 0x8049988 给出了0x8049988 &lt;__dso_handle+360&gt;: 0x75742049x/s 0x8049988 给出了一个很长的奇怪字符串,正如我所期望的:0x8049988 &lt;__dso_handle+360&gt;: "I turned the moon into something I like to call a Death Star." 我们不需要2 个十六进制值来表示每个ascii 字符吗?它是如何翻译来自0x75742049 的长字符串的?
    • @KyleWeller:func_1() 的第一个参数从0x8(%esp) 复制到%eax,然后从%eax 复制到堆栈中,作为@ 的第一个参数987654346@。 0x8049988 被直接复制到堆栈中,在那里它将作为strings_not_equal() 的第二个参数被拾取。没有任何格式的x 将地址的前 4 个字节显示为 32 位整数;这 4 个字节是 I (0x49)、空格 (0x20)、t (0x74) 和 u (0x75) 的 ASCII 码。由于您的机器是 little-endian,因此以相反的顺序读取整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2017-06-04
    • 2015-12-22
    • 2015-07-14
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多