这是我的DISAS代码:
0x0804844d <+0>: push %ebp
0x0804844e <+1>: mov %esp,%ebp
0x08048450 <+3>: and $0xfffffff0,%esp
0x08048453 <+6>: sub $0x20,%esp
0x08048456 <+9>: movl $0x8048540,(%esp)
0x0804845d <+16>: call 0x8048310 <puts@plt>
0x08048462 <+21>: lea 0x1c(%esp),%eax
0x08048466 <+25>: mov %eax,0x4(%esp)
0x0804846a <+29>: movl $0x8048555,(%esp)
0x08048471 <+36>: call 0x8048320 <scanf@plt>
0x08048476 <+41>: mov 0x1c(%esp),%eax
0x0804847a <+45>: cmp $0x208c,%eax
0x0804847f <+50>: jne 0x804848f <main+66>
0x08048481 <+52>: movl $0x8048558,(%esp)
0x08048488 <+59>: call 0x8048310 <puts@plt>
0x0804848d <+64>: jmp 0x804849b <main+78>
=> 0x0804848f <+66>: movl $0x8048569,(%esp)
0x08048496 <+73>: call 0x8048310 <puts@plt>
0x0804849b <+78>: mov $0x0,%eax
0x080484a0 <+83>: leave
0x080484a1 <+84>: ret
我要检查的是$0x208c。当我输入x/xw 0x208c时,它会返回一个错误,告诉我不能访问地址0x208c的内存。当我输入信息寄存器并查看eax时,它会显示我提供的值。所以基本上这个程序比较了两个值,根据这两个值打印出一些东西,问题是这是大学的作业,我没有代码。希望你能帮忙。谢谢您。
最佳答案
当我输入x/xw 0x208c
时,它会返回一个错误,上面写着Cannot access memory at address 0x208c
程序的反汇编说明它执行如下操作:
puts("some string");
int i;
scanf("%d", &i); // I don't know what the actual format string is.
// You can find out with x/s 0x8048555
if (i == 0x208c) { ... } else { ... }
换句话说,
0x208c
是程序硬编码的值(8332
),而不是指针。因此,gdb完全正确地告诉您,如果将0x208c
解释为指针,则该指针不会指向可读内存。我终于想到用print语句代替x/xw
您似乎不理解
print
和examine
命令之间的区别。举个例子:int foo = 42;
int *pfoo = &foo;
在上面,
print pfoo
将给您foo
的地址,x pfoo
将给您存储在该地址的值(即foo
的值)。关于c - gdb无法访问内存地址错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30139356/