程序在调用某个函数时,会先将传入的参数,调用该函数的原函数的数据地址(IP),对可能改变的寄存器进行存储压入之后进行数据区域的开辟。开辟的方式为sub rsp X
结构体和联合体的区别,结构体中声明的内容各自有各自的储存空间,而联合体中的数据空间则是联合体内最大的数据空间需求。故而联合体内部数据的位模式是相同的,但其使用不同的数据模式,则表达出的值是不同的。
数据的对齐:动机—>通过数据对齐的方式,减少内存读取时的判断。比如int数据则存放在偏移位置为4的倍数的内存中,当偏移位置不为4时,则留出该部分,继续从尾部压入。故而为了减少内存的空余损失,我们使用先进大内存需求的数据,再进小内存需求的数据的方式减少内存的空余。
!!!指针指向的数组,需要考虑其是否有值。即int (*p)[5],此时p = nullptr,需要对其进行new一个内存. p = new int[5];
堆的分配是动态的,由低地址往高地址寻找可容空间,堆的无限申请空间会导致溢出
攻击手段:使用栈空间的缓冲区溢出情况,覆盖返回的IP地址,进行可执行文件的插入,进而运行黑客自己的代码。