逆向基础 | 堆栈图

admin 2025年5月23日14:45:20评论0 views字数 857阅读2分51秒阅读模式

一、程序源码

#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);  //先入后出

堆栈分析

首先进入函数

逆向基础  |  堆栈图
逆向基础  |  堆栈图
逆向基础  |  堆栈图
逆向基础  |  堆栈图

原文始发于微信公众号(土拨鼠的安全屋):逆向基础 | 堆栈图

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月23日14:45:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   逆向基础 | 堆栈图https://cn-sec.com/archives/4088657.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息