将 xmm0 移入堆栈会导致访问冲突异常

逆向工程 例外
2021-06-25 23:52:13

反转在以下说明的最后一行崩溃的应用程序:

sub rsp,68
mov qword ptr ss:[rsp+B0],rcx
mov qword ptr ss:[rsp+B8],rdx
mov qword ptr ss:[rsp+C0],r8
mov qword ptr ss:[rsp+C8],r9
movdqa xmmword ptr ss:[rsp+20],xmm0

我是逆向工程的新手,并试图弄清楚这是如何崩溃的。

rsp+20 的内存保护应该和 rsp+B0 一样,比如...

X64DBG:EXCEPTION_ACCESS_VIOLATION

编辑:说明中的所有数字均为十六进制!(68, 20, ...)

1个回答

根据汇编命令movdqa定义,内存操作数应按 16 对齐(请参阅英特尔 SDM卷 2B 4-63):

当源或目标操作数是内存操作数时,操作数必须在 16 (EVEX.128)/32(EVEX.256)/64(EVEX.512) 字节边界或一般保护异常 (#GP ) 将生成。要将整数数据移入和移出未对齐的内存位置,请使用 VMOVDQU 指令。

如果 20 在这里不是十六进制,则可能是原因。另外如果这里的20是16进制的,rsp仍然可能没有按需要对齐。