我试图使用call指令输入另一个函数 这些是我的尝试:
call 0x08048b98
出于某种原因,这只是调用0x5d6cc555而我不知道从哪里获取该值。
mov eax, 0x08048b98
call eax
这给我一个mov指令的段错误。
我知道我必须遗漏一些东西,但我已经工作了好几个小时而无法解决问题。任何帮助将不胜感激!
答案 0 :(得分:0)
正如评论中所指出的,只需使用call 0xdeadbeef
即可。我现在已经验证了这一点,它也适用于我的机器。所以下面的答案是没用的。我仍然会把它留在这里,所以没有人后来发现这个问题而且失望地认为没有答案
我希望代码示例对其他一些初学者仍然有用。
假设ia-32表示GAS语法,应该可以使用*
将其指定为绝对地址(而不是相对跳转),并$
将其指定为常量而不是让它从这个地址加载值
因此,如果它是
call *$0xdeadbeef
但这不起作用。所以这里有一些看似有用的建议。
对于32位(gcc -m32
),我知道以下工作:
movl $0xdeadbeef, %edi
call *%edi
对于64位,您可能需要使用%rdi
代替。
另一个选项,如果您不想使用reg ,则使用标签:
.section .text
.globl main
main:
movl $0x3, %eax # some other instructions
call *(THE_ADDR) # call to your constant absolute address
ret # some other instructions
THE_ADDR:
.long 0x80483e6 # your constant absolute address
other_func: # here is 0x80483e6
movl $0x4, %eax # this code is executed
同样,这是32位AT& T GAS语法汇编代码,与gcc -m32
汇编。
为了完整起见:
mov eax, 0x08048b98 call eax
这给了我mov命令的seg错误。 这是因为如果您正在使用GAS语法,那么您正试图将eax移动到该地址。它宁愿是
mov $0x08048b98, %eax
。
This Q&A也可以为您提供帮助。