C 如何在没有调用或跳转的情况下调用ASM中的函数?

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

我目前正在尝试调用这个名为“super_secret_function”的函数,它是在main.c文件的main之外定义的。我正在使用ASM,无法使用jmp或调用来访问此“super_secret_函数”。main的内部是一个名为stack_hack的函数,我可以通过该函数更改地址以达到超级机密函数

使用GDB,我已经能够确定“super_secret_函数”的地址,并通过jmping从函数中成功地调用它。如何操作指针的返回值以返回到该地址

.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。它应该返回到旧堆栈指针的值吗?