1.堆栈:就是一段内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用。
2.查看堆栈:
dd (FS所对应的地址) 堆栈在使用时 从地址高位往地址低位使用
ESP:栈指针寄存器,ESP中存储了当前的堆栈用到哪里了(地址)。
3.堆栈的使用:
1)存储数据 例如当前堆栈用到了 0018FF8C
mov dword ptr ds:[18FF88],1
mov dword ptr ds:[18FF84],2//向比0018FF8C更低位的地址存储数据
2)修改栈顶指针(因为存储完数据后,你要告诉计算机,堆栈用到哪里了,不然计算机再执行程序时,会从原来的位置接着用堆栈,这样你刚刚存储的数据就被覆盖了)
sub esp,8
4.push指令:
功能:
- 向堆栈中压入数据
- 修改栈顶指针ESP寄存器(r16减2,r32减4)
指令格式:
push 立即数
push r32/r16寄存器(中的值)
push m16/m32 内存段 例如:PUSH DWORD PTR DS:[3AFF54]
5.pop指令
功能:
- 将栈顶数据储存到寄存器/内存
- 修改栈顶指针esp寄存器
pop eax//把当前栈顶的值拿出来储存到eax中,并且将栈顶指针加4下移
相当于
mov eax,dword ptr ds:[esp]
add esp,4
指令格式
1.pop r32/r16
2.pop m32/m16
修改EIP的指令
EIP中储存的是CPU下一次要执行的地址
1.jmp指令
mov eip,1=jum 1
mov eip,寄存器/立即数/内存(只能是dword,因为eip就是32位的)简写为 JMP 寄存器/立即数/内存
2.call指令 (执行call指令按F7)
push 下一行地址
mov eip,立即数\寄存器\内存
简写为:
call 立即数\寄存器\内存
与jmp 唯一区别:
在堆栈中存储call指令下一行。
3.ret指令
mov eip,esp 把栈顶的内容放到eip中
add esp,4 然后栈顶加4下移