gdb:如何在ASM中的内存地址处打印值

时间:2015-02-06 01:54:48

标签: assembly x86 gdb reverse-engineering

   0x08048c62 <+0>:     sub    $0x2c,%esp
   0x08048c65 <+3>:     lea    0x1c(%esp),%eax
   0x08048c69 <+7>:     mov    %eax,0xc(%esp)
   0x08048c6d <+11>:    lea    0x18(%esp),%eax
   0x08048c71 <+15>:    mov    %eax,0x8(%esp)
   0x08048c75 <+19>:    movl   $0x804a73d,0x4(%esp)
   0x08048c7d <+27>:    mov    0x30(%esp),%eax
   0x08048c81 <+31>:    mov    %eax,(%esp)
   0x08048c84 <+34>:    call   0x80488d0 <__isoc99_sscanf@plt>
=> 0x08048c89 <+39>:    cmp    $0x1,%eax

如何在最后一条指令中打印出$0x1处的内容? 我尝试了所有组合

x/d 0x1
x/d $0x1
x/s $0x1
...
...

但我要么 错误:无法访问地址0x1处的内存,或者无法将值转换为整数(即​​使我尝试将类型更改为c,s,x,a)

最终,我试图找出传递给scanf的论据,即&#34;%d%d%c&#34;

1 个答案:

答案 0 :(得分:4)

$1有一个直接值,它只是数字1。它不是地址。它会检查sscanf的返回值,即处理的项目数。转换后的值当然会放在内存中,作为参数传递给sscanf的指针。

在您的示例中,格式字符串位于0x804a73d,您应该可以使用x/s 0x804a73d进行打印。

出于效率原因,代码使用mov将项目放在堆栈而不是push。您可以在堆栈上的适当偏移处查看参数。它们从(%esp)开始,每个都是4个字节:

第一个参数(要读取的字符串):

   0x08048c7d <+27>:    mov    0x30(%esp),%eax
   0x08048c81 <+31>:    mov    %eax,(%esp)

第二个参数(格式字符串):

   0x08048c75 <+19>:    movl   $0x804a73d,0x4(%esp)

第三个参数(第一个输出指针):

   0x08048c6d <+11>:    lea    0x18(%esp),%eax
   0x08048c71 <+15>:    mov    %eax,0x8(%esp)

第四个参数(第二个输出指针):

   0x08048c65 <+3>:     lea    0x1c(%esp),%eax
   0x08048c69 <+7>:     mov    %eax,0xc(%esp)