堆栈图练习

最近学了好多东西但是懒得写,感觉太懒了,最近学习了堆栈,实在是东西太多啦,这里做个笔记,也没啥观赏性。

  • DTDebug
  • HelloWorld.exe

目标开始地址:0x401168

从这个地址的三行汇编代码

1
2
3
PUSH 2	//将十六进制的2存储到堆栈中
PUSH 1 //将十六进制的1存储到堆栈中
CALL HelloWor.0040100A //goto这个地址

这里的栈顶和栈底(也就是ESP和EBP的值):
ESP 0019FFE4
EBP 0019FF30

call命令的时候会存入一个内存地址,就是call这行的内存地址加上占用的字节,这里call命令占用了5个字节,所以将会在堆栈中保存当前内存+5的地址,也就是会保存(0040116C+5)401171

call命令会将call后面的地址给EIP并会跳转到这个地址,所以我们的EIP地址将会为0040100A

由于push和call的时候要入栈,所以这里我们的栈顶的值会变化

所以我们这里可以画出堆栈图

然后跳转到了40100A地址,这一行看到了JMP

JMP命令只会修改EIP的值,堆栈并不改变,然后会继续走下去到401040

这里接下来一直到RETN就是我们剩下要分析的汇编代码

首先

1
PUSH EBP

将EBP的值入栈,栈顶的值-4

1
MOV EBP,ESP

将ESP的值赋予给EBP

1
SUB ESP,40

ESP的值减去十六进制的四十,这里其实就是栈顶要增加,这一步的原因是为了流出缓存出来

1
2
3
PUSH EBX
PUSH ESP
PUSH EDI

将 EBX、ESP、EDI的值入栈,栈顶+12

1
LEA EDI,DWORD PTR SS:[EBP-40]

将EBP-40的地址赋值给EDI

1
2
3
MOV ECX,10
MOV EAX,CCCCCCCC
REP STOS DWORD PTR ES:[EDI]

这一步的目的是为了清除多余的垃圾缓存,重复十次,将值赋值成CCCCCCCC

1
2
MOV EAX,DWORD PTR SS:[EBP+8]
ADD EAX,DWORD PTR SS:[EBP+C]

这两步的意思就是将我们刚存进来的1和2相加

1
2
3
4
5
6
POP EDI
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
RETN

清除缓存,就不详细分析了

这里就会返回到刚开始CALL后的下一行

这里有一个ADD操作,因为到这一步的时候栈顶和栈底的值和刚开始的时候不一样,要恢复成刚开始的样子,这一步叫做堆栈平衡

完~

图不画了~懒


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sher10cksec@foxmail.com

文章标题:堆栈图练习

本文作者:sher10ck

发布时间:2020-02-26, 20:50:21

最后更新:2020-02-28, 14:04:00

原始链接:http://sherlocz.github.io/2020/02/26/堆栈图练习/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录