此刻,我正在研究网络安全,我们学习了如何用汇编代码段构建堆栈。但是由于缺少示例,因此我不确定这样做的想法。
问题是:
假定一个空堆栈,寄存器
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
我知道pop
,push
,inc
等的工作方式(除了lea
我不太确定)。
对于堆栈,我得到了以下结果:
2
0x00 (or 0 not so sure About this)
0x00
0x00
0x00
42
,而rsp
是带有42的条目。
我环顾四周,但没有找到与我的锻炼相似的例子。我希望有人可以告诉我,如果我犯了一个错误,我在哪里犯错了,因为对我来说,这是错误的。
答案 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
对最终堆栈没有实际影响。但是,他们确实更改了寄存器R10
和R11
。