伪造Microsoft x64 Asm中的返回地址

时间:2016-06-13 01:17:55

标签: assembly stack 64-bit

我正在尝试通过程序集(microsoft x64)使用伪造的返回地址调用函数。但是,我似乎无法获得识别返回地址的功能。作为测试,我编写了一个小型测试应用程序,其中的函数将打印出它在堆栈中看到的所有返回地址。

用我的asm调用这个函数时,我得到的是没有打印的返回地址,或者来自某个内核函数的返回地址,或者崩溃。

以下是我的尝试:

sub rsp, 0x20           ; shadow space required by all functions
mov rax, 0xDEADDEADBEEF ; fake return address 
push rax                ; push the return address, simulating a call
jmp functiontocall      ; jmp to function

这会崩溃,不是因为它无法返回到DEADDEADBEEF,而是在函数的某个地方。显然我在某种程度上使堆栈格式不正确。

我也尝试过以下几点:

sub rsp, 0x20
mov rax, 0xDEADDEADBEEF  
push rax                  ; push fake return address
sub rsp, 0x20             ; inner calling function starts here
mov rax, functiontocall
call rax
add rsp, 0x20             ; return address 1
pop rax                   ; should remove fake return address
add rsp, 0x20
ret

有趣的是,这不会崩溃,但是在打印呼叫地址时,它完全忽略了我的伪造地址。所以,显然我没有正确设置假的返回地址。

非常感谢任何帮助。我希望我已经明确了我要做的事情,但我担心我可以做得更清楚。

作为旁注,我知道这个问题Faking ASM Return Address?,并尝试了其中的建议 - 但无济于事。无论如何,该问题涉及x86 asm,而不是x64。

感谢。

0 个答案:

没有答案