• 缓冲区溢出之栈溢出原理(中篇)


    0x01 字符串在栈中如何储存

    上篇对栈的原理进行分析

    (1)示例程序,程序是定义了两个int类型的变量,两个字符串类型的变量
    在这里插入图片描述
    (2)OD载入一下,这个是程序的真正的入口地址OEP,也就是main函数开始,上一章说了进入函数首先压入EBP(push ebp),之后要开辟函数特有的栈空间(就是sub esp,0x28)
    在这里插入图片描述在这里插入图片描述

    F8继续往下执行到0x00401227这个位置,这是EBP已经压入,栈空间也开辟出来了

    在这里插入图片描述在这里插入图片描述

    这个就是完整的函数栈空间的示意图,之后变量将储存在开辟的栈空间当中

    在这里插入图片描述
    (3)下面储存了一个int类型的变量,对应的操作是:mov dword ptr ss:[ebp-0x4],0x1。ebp是栈底指针,指向开辟的栈空间的底部(这里的底部是相对的,其实对应的内存地址是高位,栈顶是低位,反过来的,如上图所示)。这句话的意思就是将0x1(也就是1)的值放入ebp-0x4的内存地址。执行一下,观察堆栈变化
    在这里插入图片描述
    此时发现开辟的栈中储存了0x1这个值,大小为一个栈帧(4个字节)
    在这里插入图片描述
    下图为逻辑图
    在这里插入图片描述
    (4)之后在储存第二个int类型的变量
    在这里插入图片描述在这里插入图片描述
    逻辑图
    在这里插入图片描述
    (5)储存第一个字符串,对应的操作是

     mov eax,dword ptr ds:[0x401210]
     mov edx,dword ptr ds:[0x401214]
     mov dword ptr ss:[ebp-0x10],eax
     mov dword ptr ss:[ebp-0xC],edx
    

    之后在观察一下堆栈的变化
    在这里插入图片描述
    在这里插入图片描述
    程序编写时,申请的是8个字节的空间,储存的字符串是Hello。由于栈帧只有4个字节,所以0x0240FF10地址储存的是Hell(16进制表示为6C6C6548,小尾方式储存),0x0240FF14储存的是o(16进制表示为6F,其他的字节没有用),对应的逻辑图
    在这里插入图片描述
    (6)之后添加最后一个字符串变量World,这里就不截OD的图了,直接上逻辑图
    在这里插入图片描述

    0x02 总结

    以上就是变量在栈中的储存方式,在函数开辟的栈中,由下往上将变量压入栈中,地址由高往低。下面请看:缓冲区溢出之栈溢出原理学习(下篇)

  • 相关阅读:
    opacity兼容性以及存在问题处理
    删除节点方法要注意的区别
    java基础-常见面试题(一)
    第04次作业-树
    第03次作业-栈和队列
    第02次作业-线性表
    Data_Structure-绪论作业
    C语言第二次实验报告
    C语言第一实验报告
    mysql 查询优化
  • 原文地址:https://www.cnblogs.com/csnd/p/11800546.html
Copyright © 2020-2023  润新知