这是我的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
Run Code Online (Sandbox Code Playgroud)
我要检查的是$ 0x208c.当我输入x/xw 0x208c时,它会给我一个错误,表示无法访问地址0x208c的内存.当我输入Info寄存器并查看eax时,它会显示我提供的值.所以基本上这个程序比较两个值,并根据打印出来的东西.问题是这是大学的家庭作业,我没有代码.希望你能帮忙.谢谢.
Emp*_*ian 14
当我输入
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 { ... }
Run Code Online (Sandbox Code Playgroud)
换句话说,0x208c是8332程序在其中硬编码的值(),而不是指针.因此,GDB完全正确地告诉您如果将其解释0x208c为指针,则该指针不指向可读内存.
我终于想出使用print语句而不是x/xw
您似乎不理解print和examine命令之间的区别.考虑这个例子:
int foo = 42;
int *pfoo = &foo;
Run Code Online (Sandbox Code Playgroud)
通过以上,print pfoo会给你的地址的foo,并且x pfoo会给你的值存储在该地址(即价值foo).
我发现不可能检查没有的mmaped内存PROT_READ标志的。这不是 OP 的问题,而是我的问题,错误信息是一样的。
代替
mmap(0, size, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
Run Code Online (Sandbox Code Playgroud)
做
mmap(0, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
Run Code Online (Sandbox Code Playgroud)
瞧,可以检查内存。