gdb:How 在 ASM 中的内存地址打印值
gdb:How to print value at memory address in ASM
0x08048c62 <+0>: sub [=11=]x2c,%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 [=11=]x804a73d,0x4(%esp)
0x08048c7d <+27>: mov 0x30(%esp),%eax
0x08048c81 <+31>: mov %eax,(%esp)
0x08048c84 <+34>: call 0x80488d0 <__isoc99_sscanf@plt>
=> 0x08048c89 <+39>: cmp [=11=]x1,%eax
如何打印出最后一条指令中 [=13=]x1
处的内容?
我尝试了所有组合
x/d 0x1
x/d [=12=]x1
x/s [=12=]x1
...
...
但我要么得到
错误:无法访问地址 0x1 处的内存,或者值无法转换为整数(即使我尝试将类型更改为 c,s,x,a)
最终,我试图找出传递给 scanf
的参数,即“%d %d %c”
</code>有一个立即数,就是数字<code>1
。这不是一个地址。它正在检查 sscanf
的 return 值,即已处理的项目数。转换后的值当然放在内存中作为参数传递给 sscanf
的指针处。
在您的示例中,格式字符串位于 0x804a73d
,您应该能够使用 x/s 0x804a73d
.
打印它
出于效率原因,代码使用 mov
而不是 push
将项目放入堆栈。您可以在堆栈上的适当偏移处看到参数。它们从 (%esp)
开始,每个都是 4 个字节:
第一个参数(要读取的字符串):
0x08048c7d <+27>: mov 0x30(%esp),%eax
0x08048c81 <+31>: mov %eax,(%esp)
第二个参数(格式字符串):
0x08048c75 <+19>: movl [=11=]x804a73d,0x4(%esp)
第三个参数(第一个输出指针):
0x08048c6d <+11>: lea 0x18(%esp),%eax
0x08048c71 <+15>: mov %eax,0x8(%esp)
第 4 个参数(第 2 个输出指针):
0x08048c65 <+3>: lea 0x1c(%esp),%eax
0x08048c69 <+7>: mov %eax,0xc(%esp)
0x08048c62 <+0>: sub [=11=]x2c,%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 [=11=]x804a73d,0x4(%esp)
0x08048c7d <+27>: mov 0x30(%esp),%eax
0x08048c81 <+31>: mov %eax,(%esp)
0x08048c84 <+34>: call 0x80488d0 <__isoc99_sscanf@plt>
=> 0x08048c89 <+39>: cmp [=11=]x1,%eax
如何打印出最后一条指令中 [=13=]x1
处的内容?
我尝试了所有组合
x/d 0x1
x/d [=12=]x1
x/s [=12=]x1
...
...
但我要么得到 错误:无法访问地址 0x1 处的内存,或者值无法转换为整数(即使我尝试将类型更改为 c,s,x,a)
最终,我试图找出传递给 scanf
的参数,即“%d %d %c”
</code>有一个立即数,就是数字<code>1
。这不是一个地址。它正在检查 sscanf
的 return 值,即已处理的项目数。转换后的值当然放在内存中作为参数传递给 sscanf
的指针处。
在您的示例中,格式字符串位于 0x804a73d
,您应该能够使用 x/s 0x804a73d
.
出于效率原因,代码使用 mov
而不是 push
将项目放入堆栈。您可以在堆栈上的适当偏移处看到参数。它们从 (%esp)
开始,每个都是 4 个字节:
第一个参数(要读取的字符串):
0x08048c7d <+27>: mov 0x30(%esp),%eax
0x08048c81 <+31>: mov %eax,(%esp)
第二个参数(格式字符串):
0x08048c75 <+19>: movl [=11=]x804a73d,0x4(%esp)
第三个参数(第一个输出指针):
0x08048c6d <+11>: lea 0x18(%esp),%eax
0x08048c71 <+15>: mov %eax,0x8(%esp)
第 4 个参数(第 2 个输出指针):
0x08048c65 <+3>: lea 0x1c(%esp),%eax
0x08048c69 <+7>: mov %eax,0xc(%esp)