堆栈图练习
最近学了好多东西但是懒得写,感觉太懒了,最近学习了堆栈,实在是东西太多啦,这里做个笔记,也没啥观赏性。
- DTDebug
- HelloWorld.exe
目标开始地址:0x401168
从这个地址的三行汇编代码1
2
3PUSH 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 | PUSH EBX |
将 EBX、ESP、EDI的值入栈,栈顶+12
1 | LEA EDI,DWORD PTR SS:[EBP-40] |
将EBP-40的地址赋值给EDI
1 | MOV ECX,10 |
这一步的目的是为了清除多余的垃圾缓存,重复十次,将值赋值成CCCCCCCC
1 | MOV EAX,DWORD PTR SS:[EBP+8] |
这两步的意思就是将我们刚存进来的1和2相加
1 | POP EDI |
清除缓存,就不详细分析了
这里就会返回到刚开始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" 转载请保留原文链接及作者。