【发布时间】:2020-03-26 01:49:43
【问题描述】:
我在分配 128 位变量时遇到问题,以便它在 16 字节边界上对齐(在堆栈上,而不是在堆上)。当我的函数被调用时,我无法控制堆栈是否对齐,所以我只是直接假设它不是。
这是我的函数的样子(简化):
; start of stackframe
push ebp
mov ebp, esp
; space for our variable
sub esp, 0x10
; the 128-bit variable would be at [ebp - 0x10]
...
; end of stackframe
mov esp, ebp
pop ebp
现在我可以通过在sub esp, 16 之前插入and esp, 0xFFFF'FFF0 来对齐变量,但是我将不再能够用[ebp - 0x10] 引用它,因为ebp 将引用旧的、未对齐的堆栈指针。
考虑到这一点,我认为我需要在 mov ebp, esp 指令之前对齐堆栈,以便我能够手动对齐我的变量。所以在这个例子中:
; align esp
and esp, 0xFFFF'FFF0
; start of stackframe
push ebp
mov ebp, esp
; padding (because of the push ebp)
sub esp, 0xC
; space for our variable
sub esp, 0x10
; the 128-bit variable would be at [ebp - 0x10]
...
; end of stackframe
mov esp, ebp
pop ebp
问题是我们不会在堆栈帧末尾正确清理堆栈(不确定)。这是因为我们在对齐堆栈之后执行mov ebp, esp。
我真的想不出一个好的方法来做到这一点。由于 sse 对齐要求,我觉得这应该是一个常见问题,但我找不到关于该主题的太多信息。还要记住,在调用我的函数之前,我无法控制堆栈,因为这是 shellcode。
编辑: 我想一种解决方案是将我的堆栈帧包装在另一个堆栈帧中。所以是这样的:
push ebp
mov ebp, esp
; align the stack
and esp, 0xFFFF'FFF0
; the "real" stackframe start
push ebp
mov ebp, esp
; padding due to the push ebp prior to this
sub esp, 0xC
; space for our variable
sub esp, 0x10
; our variable is now at [ebp - 0x1C] (i think)
...
; the "real" stackframe end
mov esp, ebp
pop ebp
mov esp, ebp
pop ebp
【问题讨论】:
标签: assembly x86 memory-alignment callstack