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

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 总结

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

猜你喜欢

转载自blog.csdn.net/qq_38924942/article/details/86585020