一、程序源码
#include"stdio.h"
intPlus(int x,int y)
{
int z = 2;
return x + y + z;
}
intmain(int argc,char* argv[])
{
int r = Plus(3,4);
return0;
}
二、汇编语言
当前代码所处的地址为0x00401078,打开od定位到该地址。
三、OD分析
注意:
进入od之后,通过地址找到代码对应的汇编,需要使用F4从光标选中的地方开始执行,默认是从黑色光标开始执行汇编代码。
1、push指令
程序push两次数据之后,栈顶也就是esp,会向上移动esp-8(一个内存单元为4字节,也就是32位)。2、call指令
EIP寄存器:EIP寄存器中存贮地址,该地址表示当前程序所处的位置的地址。
call指令用来调用一个函数。在od中使用F7来跟进。执行call指令会分两步:
-
将call指令的下一条指令地址压入堆栈,因为call指令执行完毕之后,还要回到原来的地址。 -
首先会跳转到一个JMP指令所在的地址,然后进入子程序
然后:
-
将ebp压入栈中。将栈顶和栈底重合,也就是说修改EBP,把ESP的值存入EBP。 -
将栈顶增加留出缓冲区,程序运行需要内存。即修改栈顶位置。44为十六进制。 -
保留现场将EBX、ESI、EDI存入栈中(保护现场)。 -
修改EDI的值,此时堆栈没有变化。 -
填充缓冲区 -
进行运算
-
恢复现场 -
恢复栈顶、栈底 -
retn pop eip
四、堆栈图
五、堆栈平衡
函数执行完毕之后,进行堆栈平衡叫做外平栈
六、函数
#include<stdio.h>
intfunction(int a,int b,int c)//a=9,b=12,c=5
{
if(a>b){
if(b>c){
return c;
}
return b;
}
else{
if(a>c){
return c;
}
return a;
}
}
voidmain(int argc,char* argv[])
{
function(5,12,9); //先入后出
}
堆栈分析
首先进入函数
原文始发于微信公众号(土拨鼠的安全屋):逆向基础 | 堆栈图
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论