我目前正試圖調用這個名爲「super_secret_function」的函數,它在文件main.c中的main之外定義。我正在使用ASM,不能使用jmp或調用來達到這個「super_secret_function」。 main的內部是一個叫做stack_hack的函數,這個函數是我可以通過改變地址來達到超級祕密函數的功能。如何在沒有調用或跳轉的情況下在ASM中調用函數?
使用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
一個什麼是「指針的返回值」? – immibis
作爲最低限度,'ret'從堆棧中獲取一個值並使用它來更改IP。你怎麼能改變堆棧上的內容,這可以用來把你帶到某個地方,而不是從某處返回。提示:實際上並沒有你想象的那麼難。 :) – enhzflep
非常感謝。我將目標移動到%rax中,然後在彈出rbp後,我將%rax壓入堆棧並返回 –