我知道x64的调用约定,前四个参数在rcx中,rdx,r8,r9,rest在堆栈中。但我的问题是,如何推动这些论点?
call_func PROC
push rbp
mov rbp, rsp
mov rbx, rcx ; move C function address to rbx
mov rcx, 1 ; some dummy value
mov rdx, 2 ; some dummy value
mov r8, 3 ; some dummy value
mov r9, 4 ; some dummy value
; and now I want to push fifth argument, but how?
call rbx ; call the function
mov rsp, rbp
pop rbp
ret
call_func ENDP我尝试过mov QWORD PTR [rsp + 20h], 1,但从这个asm函数返回时,RIP寄存器被设置为奇怪的值,如0x000000000000000001。我知道RIP寄存器是指令指针,但它为什么要修改它?
我又尝试了一件事,让函数接受6个参数,当我传递像mov QWORD PTR [rsp + 28h], 1这样的第六个参数时,应用程序是正常的,第六个参数被传递,第五个参数有奇怪的值。
发布于 2021-09-05 13:27:02
正如Jester所说,在推送参数之前,我需要为这些参数分配空间,包括shadow space。
最终工作代码:
call_func PROC
push rbp
mov rbp, rsp
sub rsp, 32 ; allocate shadow space 'padding'
sub rsp, 16 ; allocate space for fifth and sixth argument
mov r11, rcx ; move C function address to r11
mov rcx, 1 ; some dummy value
mov rdx, 2 ; some dummy value
mov r8, 3 ; some dummy value
mov r9, 4 ; some dummy value
mov QWORD PTR [rsp + 20h], 5 ; push fifth argument
mov QWORD PTR [rsp + 28h], 6 ; push sixth argument
call r11 ; call the function
mov rsp, rbp
pop rbp
ret
call_func ENDPhttps://stackoverflow.com/questions/69063481
复制相似问题