更改内存中的“呼叫”地址?

鬼火

这是针对 64 位 x86 Intel 处理器的。

在 GDB 中,我可以看到:

0x400500 <main+50>: call 0x400100 <somefunc>

然而,当我检查 0x400500 处的内存时,我看不到任何对“0x400100”的引用,附近的寄存器中也没有任何明显的东西。

它如何“知道”在哪里调用。看起来很简单,但我一直无法找到答案。

我正在尝试使用上述函数的参数调用例如系统,并且只能有限地访问内存。请注意,这只是为了好玩,是挑战练习的一部分。

受雇俄语

它如何“知道”在哪里调用。

要调用的地址是调用指令的偏移量

例子:

int foo() { return 42; }
int main() { return foo(); }

gcc -g t.c
gdb -q ./a.out

(gdb) disas/r main
Dump of assembler code for function main:
   0x00000000004004f8 <+0>: 55  push   %rbp
   0x00000000004004f9 <+1>: 48 89 e5    mov    %rsp,%rbp
   0x00000000004004fc <+4>: b8 00 00 00 00  mov    $0x0,%eax
   0x0000000000400501 <+9>: e8 e7 ff ff ff  callq  0x4004ed <foo>
   0x0000000000400506 <+14>:    5d  pop    %rbp
   0x0000000000400507 <+15>:    c3  retq
End of assembler dump.

(gdb) p &foo
$1 = (int (*)()) 0x4004ed <foo>

(gdb) p/x 0x4004ed - 0x0000000000400506
$2 = 0xffffffe7

请注意e7 ff ff ff属于callq. 这就是偏移量,用小端法拼写。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章