如何用汇编代码构建堆栈?

时间:2019-05-14 19:38:47

标签: assembly stack x86-64

此刻,我正在研究网络安全,我们学习了如何用汇编代码段构建堆栈。但是由于缺少示例,因此我不确定这样做的想法。

问题是:

  

假定一个空堆栈,寄存器rax最初为1,所有其他为0。在以下代码完成后绘制堆栈布局,并标记rsp指向的位置。注意:堆栈从上到下增长。

push rax
inc rax
push rax
lea r11, [rip]
push r11
pop rcx
xor rcx, rcx
push rcx
mov rdx, 0xffff0000
push dx
pop r10w
push r10
add rax, 40
push rax

我知道poppushinc等的工作方式(除了lea我不太确定)。
对于堆栈,我得到了以下结果:

2
0x00 (or 0 not so sure About this)
0x00
0x00
0x00
42

,而rsp是带有42的条目。

我环顾四周,但没有找到与我的锻炼相似的例子。我希望有人可以告诉我,如果我犯了一个错误,我在哪里犯错了,因为对我来说,这是错误的。

1 个答案:

答案 0 :(得分:1)

  

在以下代码完成之后绘制堆栈布局,并标记rsp指向的位置。

您应该详细地写出它,而不是试图在脑海中做到这一点:

code                  stack   register changes
--------------------  -----   ----------------
push rax              1

inc  rax                      rax=2
push rax              1
                      2

lea  r11, [rip]               r11=?
push r11              1
                      2
                      ?

pop  rcx              1       rcx=?
                      2

xor  rcx, rcx                 rcx=0
push rcx              1
                      2
                      0

mov  rdx, 0xffff0000          rdx=0xFFFF0000 -> dx=0
push dx               1
                      2
                      0
                      0

pop  r10w             1       r10w=0 -> r10=0
                      2
                      0

push r10              1
                      2
                      0
                      0

add  rax, 40                  rax=42
push rax              1
                      2
                      0
                      0
                     42 <-- RSP points below here
lea r11, [rip]
push r11
pop rcx

mov rdx, 0xffff0000
push dx
pop r10w

对最终堆栈没有实际影响。但是,他们确实更改了寄存器R10R11