栈是遵循先进后出原则,那指针是用来干嘛的?

发布网友

我来回答

3个回答

热心网友

当然可以啊,只要你能不弄错先后,知道自己改的是什么,修改完后恢复栈顶指针,完全可以修改栈数据,这也是种hack技术,不过这对编程技术要求很高,很危险,一不小心就会导致程序崩溃,然后你都不知道错在哪里。

 

其实,你可以编写一个简单的函数,在main中调用它,编译后设置断点,然后调试运行,执行到断点处停止后,在调试菜单内选择反汇编观察这段代码,你会发现,编译器会在真正执行函数前都会安排一段指令修改栈数据的。

 

如下

void fun()
{
001810  push        ebp  //基指针入栈备份
001811  mov         ebp,esp  //栈顶指针赋值给基指针备用
001813  sub         esp,0C0h  //修改栈顶,上移C0个字节,留出空间给临时变量
001819  push        ebx  //地址寄存器入栈备份
00181A  push        esi  //源址寄存器入栈备份
00181B  push        edi  //目的寄存器入栈备份
00181C  lea         edi,[ebp-0C0h]  //原栈顶指针向上偏移C0个字节作为目的地址存入目的寄存器,注意此时ebp包含的是栈顶指针
001822  mov         ecx,30h//设置循环次数,每次赋值一个双字,即4字节,所以4*30h正好为C0个字节。  
001827  mov         eax,0CCCCCCCCh  //设置填充值,4个字节的cc,cc为中断指令3,即int 3,防止程序意外跳转到该临时数据区执行时会调用系统中断#3处理
00182C  rep stos    dword ptr es:[edi]//执行循环填充数据

热心网友

不行 因为要遵循先进后出的原则

热心网友

我靠~~~~~~~这么专业的知识~~~~~~~~~~~~~~~~~~~~~

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com