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;
答案 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)