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

时间:2016-05-17 00:52:48

标签: c assembly x86-64

我目前正在尝试调用名为“super_secret_function”的函数,该函数在main.c文件的main之外定义。我正在使用ASM,不能使用jmp或调用来达到这个“super_secret_function”。 main内部是一个名为stack_hack的函数,它是我能够操作来改变地址以达到超级秘密函数的函数。

使用GDB我已经能够确定“super_secret_function”的地址,并通过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

3 个答案:

答案 0 :(得分:4)

由于这听起来像是家庭作业,我不会给你一个确切的答案,但我会试着指出你正确的方向。

您说您无法使用jmpcall,但函数末尾的ret也会更新程序计数器。你怎么能影响它更新程序计数器的价值?

答案 1 :(得分:1)

请注意您自己的示例代码及其评论:

        ret       # pop the instruction pointer into %rip

数据是否会被ret指令弹出到%rip中?

答案 2 :(得分:0)

在%rax中加载地址后修复,并且在返回之后弹出%rbp之后我将%rax推入堆栈