我目前正在尝试调用名为“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
答案 0 :(得分:4)
由于这听起来像是家庭作业,我不会给你一个确切的答案,但我会试着指出你正确的方向。
您说您无法使用jmp
或call
,但函数末尾的ret
也会更新程序计数器。你怎么能影响它更新程序计数器的价值?
答案 1 :(得分:1)
请注意您自己的示例代码及其评论:
ret # pop the instruction pointer into %rip
数据是否会被ret指令弹出到%rip中?
答案 2 :(得分:0)
在%rax中加载地址后修复,并且在返回之后弹出%rbp之后我将%rax推入堆栈