C 如何在没有调用或跳转的情况下调用ASM中的函数?
我目前正在尝试调用这个名为“super_secret_function”的函数,它是在main.c文件的main之外定义的。我正在使用ASM,无法使用jmp或调用来访问此“super_secret_函数”。main的内部是一个名为stack_hack的函数,我可以通过该函数更改地址以达到超级机密函数 使用GDB,我已经能够确定“super_secret_函数”的地址,并通过jmping从函数中成功地调用它。如何操作指针的返回值以返回到该地址C 如何在没有调用或跳转的情况下调用ASM中的函数?,c,assembly,x86-64,C,Assembly,X86 64,我目前正在尝试调用这个名为“super_secret_function”的函数,它是在main.c文件的main之外定义的。我正在使用ASM,无法使用jmp或调用来访问此“super_secret_函数”。main的内部是一个名为stack_hack的函数,我可以通过该函数更改地址以达到超级机密函数 使用GDB,我已经能够确定“super_secret_函数”的地址,并通过jmping从函数中成功地调用它。如何操作指针的返回值以返回到该地址 .globl stack_hack stack_ha
.globl stack_hack
stack_hack:
pushq %rbp # push the base pointer on the stack
movq %rsp, %rbp # move the previous stack pointer to the new base poi
##MyCode
movq $0x00000000004005b4, %rbp
jmp *%rbp
##EndMyCode
movq %rbp, %rsp # move the stack pointer to the base pointer
popq %rbp # pop the base pointer and load it into %rbp
ret # pop the instruction pointer into %rip
因为这听起来像是一个家庭作业,我不会给你一个确切的答案,但我会尽力为你指出正确的方向
您说过不能使用
jmp
或call
,但函数末尾的ret
也会更新程序计数器。您如何影响程序计数器的更新值?由于这听起来像是家庭作业,我不会给您一个确切的答案,但我会尝试为您指出正确的方向
您说过不能使用
jmp
或call
,但函数末尾的ret
也会更新程序计数器。如何影响程序计数器的更新值?请注意您自己的示例代码和注释:
ret # pop the instruction pointer into %rip
ret指令将弹出到%rip中的数据在哪里?请注意您自己的示例代码及其注释:
ret # pop the instruction pointer into %rip
ret指令将弹出到%rip中的数据在哪里?在%rax中加载地址后修复,在ret前弹出%rbp后我将%rax推到堆栈上在%rax中加载地址后修复,在ret前弹出%rbp后我将%rax推到堆栈上什么是“指针的返回值”?作为最低要求,
ret
从堆栈中获取一个值,并使用它来更改IP。你如何改变堆栈上的内容,这可以用来把你带到某个地方,而不是从某个地方返回?提示:其实并不像你想象的那么难非常感谢你。我将目标移动到%rax,在弹出rbp关闭后,我将%rax推到堆栈上,并返回不这样做。它会使返回地址预测器堆栈出错,并会降低您的性能。只需使用call/jmp指令。CPU知道这意味着什么,并针对这种情况进行了优化。@RaymondChen我很确定这是一个家庭作业,而不是一个实践练习;性能很可能不是问题。:)什么是“指针的返回值”?作为最低要求,ret
从堆栈中获取一个值,并使用它来更改IP。你如何改变堆栈上的内容,这可以用来把你带到某个地方,而不是从某个地方返回?提示:其实并不像你想象的那么难非常感谢你。我将目标移动到%rax,在弹出rbp关闭后,我将%rax推到堆栈上,并返回不这样做。它会使返回地址预测器堆栈出错,并会降低您的性能。只需使用call/jmp指令。CPU知道这意味着什么,并针对这种情况进行了优化。@RaymondChen我很确定这是一个家庭作业,而不是一个实践练习;性能很可能不是问题。:)我被卡住了。我尝试将%rbp放入%rsp,但也导致了失败。1)函数末尾的ret
从何处获取其值?2) 你如何影响这一点?(提示:第一个问题在您的代码列表中得到了回答。)它获取值rax并将其放入ripNo,这不是ret
所做的。请阅读注释并重试。可能我不理解ret。它应该返回到旧堆栈指针的值?TBH我被卡住了。我尝试将%rbp放入%rsp,但也导致了失败。1)函数末尾的ret
从何处获取其值?2) 你如何影响这一点?(提示:第一个问题在您的代码列表中得到了回答。)它获取值rax并将其放入ripNo,这不是ret
所做的。请阅读注释并重试。可能我不理解ret。它应该返回到旧堆栈指针的值吗?