堆栈图1
一、
1、找到画堆栈图从401168开始画,ctrl+g出来一个弹窗,在弹窗上输入要找到哪一行输入0x401168,他会直接跳转
2、在那一行f2下断点点开始运行让cpu运行到该行停止(画堆栈图要关注栈底EBP,栈顶ESP两个寄存器)
(1)调用前
(2)push2:栈顶减4,2被压入,为压栈
push2之后栈顶减了4,2被压入,为压栈
(3)push1
(4)call 0x0040100A,到相应位置,ESP减4,EIP变成跳转后的地址(这行指令相当于mov EIP,0x0040100A),而call指令的下一行地址(0040116C加上E8、99、FE、FF、FF五个字节变成00401171)被压入栈顶
!!call这里不能用f8来运行,只能用f7!!
按一下enter,回到要画堆栈图的那段程序
(5)push EBP:ESP减4,eip为运行到的地址,EBP的值被压到栈顶
(6)mov ebp,esp:把ESP的值赋给ebp,只有ebp和eip变了
(7)sub ESP,40:ESP减了40(16进制),eip改变
减40(16进制)一个框为四个字节,40/4=10(16进制)转换为10进制的为16,所以往上数16格
(8)push EBX:ESP和栈顶减4,EBX中的值push到内存栈顶中
(9)push ESI
push EDI
(10)LEA EDI,DWORD PTR SS:[ESP-40]:堆栈没有变化,将ESP-40后的值放到EDI中
(11)MOV ECX,10
MOV EAX,CCCCCCCC
REP STOS DWORD PTR ES:[EDI]
STOS是看D位为0加4为1减4,将CCCCCCCC赋给EAX在把他放到EDI指向的内存里然后加4(此处D位为0),再把CCCCCCCC赋给EAX再放到EDI加4后的地址中再加4,REP重复16次(10为16进制换为10进制为16次)
FEE4到FF24全部变成cc