2016-05-17 68 views
1

我目前正試圖調用這個名爲「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 
+0

一個什麼是「指針的返回值」? – immibis

+0

作爲最低限度,'ret'從堆棧中獲取一個值並使用它來更改IP。你怎麼能改變堆棧上的內容,這可以用來把你帶到某個地方,而不是從某處返回。提示:實際上並沒有你想象的那麼難。 :) – enhzflep

+0

非常感謝。我將目標移動到%rax中,然後在彈出rbp後,我將%rax壓入堆棧並返回 –

回答

4

由於這聽起來像是一項家庭作業,我不會給你一個確切的答案,但我會嘗試指出你在正確的方向。

你說你不能使用jmpcall,但在函數結尾的ret也會更新程序計數器。你如何影響更新程序計數器的值?

+0

TBH我非常堅持。我曾嘗試將%rbp放入%rsp,但也導致失敗。 –

+2

1)函數末尾的'ret'從哪裏得到它的值? 2)你如何影響這個? (提示:第一個問題在您的代碼清單中得到了解答。) – duskwuff

+0

它獲取值rax並將其放入rip –

1

注意自己的示例代碼和它的評論:

 ret  # pop the instruction pointer into %rip 

其中的數據將由ret指令被彈出到RIP%?

0

固定在裝載RAX%的地址後,和RET之前彈出%RBP後,我被推%RAX到堆棧

相關問題