【发布时间】:2019-09-01 19:49:36
【问题描述】:
我已经用 Radare2 反汇编了一个 C 程序。在这个程序中,有很多对scanf 的调用,如下所示:
0x000011fe 488d4594 lea rax, [var_6ch]
0x00001202 4889c6 mov rsi, rax
0x00001205 488d3df35603. lea rdi, [0x000368ff] ; "%d" ; const char *format
0x0000120c b800000000 mov eax, 0
0x00001211 e86afeffff call sym.imp.__isoc99_scanf ; int scanf(const char *format)
0x00001216 8b4594 mov eax, dword [var_6ch]
0x00001219 83f801 cmp eax, 1 ; rsi ; "ELF\x02\x01\x01"
0x0000121c 740a je 0x1228
这里scanf 具有从行lea rdi, [0x000368ff] 传递给它的字符串"%d" 的地址。我假设0x000368ff 是可执行文件中"%d" 的位置,因为如果我在调试模式下重新启动Radare2 (r2 -d ./exec),那么lea rdi, [0x000368ff] 将被lea rdi, [someMemoryAddress] 替换。
如果lea rdi, [0x000368ff] 是硬编码在文件中的,那么指令在运行时如何更改为实际内存地址?
【问题讨论】:
-
搬迁地址可能吗?反汇编器显示一些相对地址,调试器显示真实重定位?
标签: c assembly x86-64 memory-address