Gho*_*les -1 c x86 assembly stack gdb
这是用于64位x86 Intel处理器的。
在GDB中,我可以看到:
0x400500 <main+50>: call 0x400100 <somefunc>
Run Code Online (Sandbox Code Playgroud)
但是,当我检查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
Run Code Online (Sandbox Code Playgroud)
请注意e7 ff ff ff是的一部分的字节callq。这就是偏移量,用little-endian拼写。