我正在尝试通过程序集(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。
感谢。