栈溢出攻击

为什么会有栈

当我们写大型程序时,一个函数可能会被反复调用,而这个函数里面的局部变量每次都要重新申请内存,分配空间,用完后又要销毁,就像酒店开房一样,开房、退房,那么系统会非常繁琐,(如果提前把房开好,就会更加方便)如果给他们分配一个固定的内存,内存又造成了浪费,所以就有了栈,既简单,又分配好了内存,栈就是一段已经分配好了的内存,用的时候放到栈里,不用就直接离开,由栈自动回收变量,只需要管理栈的读写就能管理变量的声明与回收。esp表示栈顶,esp以下的都是已使用的空间,ebp代表栈底

知识扩展*:CPU的寄存器,CPU自己的内存空间,体积非常小,有什么作用呢?比如要算1+2时,会从内存中要到1,然后把1放入寄存器,然后再要+和2,不然要到1后,1就没地方放,为了不影响效率,寄存器不多,有eax、edx,ecx,ebp,esp,edi等。

指令详解

push     0C8h

第一步:esp=ssp-4           第二步:esp的内存写入C8

call     add (06C12C6h)

第一步:esp=esp-4          第二步:esp的内存写入call指令的下一条指令的地址006C1E28

pop   ebp

第一步:EBP=&ESP    第二步:esp=esp+4

ret   

跳转到esp内存地址里的值

栈空间的模拟图

0x10024
0x10028
0x1002c

0x10030

0x10034
0x10038

ESP加4就是下移,减4就是往上移,ESP以下的空间都能使用,以上的不能使用,假设ESP=10034,则它的模拟位置再10034和10030之间的那根横线,,代表了10034,上移4,就移一个小格,即上一根横线处,代表i了10030

栈溢出攻击

我们计算好溢出的长度,编写好溢出数据,让我们想要的地址数据正好覆盖到函数返回地址,那么被调函数调用完返回主函数时,就会跳转到我们覆盖的地址上。通过这样改变程序流程

你可能感兴趣的:(C++小学之函数,c++,安全)