栈是遵循先进后出原则,那指针是用来干嘛的?
发布网友
发布时间:2022-04-26 10:13
我来回答
共3个回答
热心网友
时间:2022-06-27 05:48
当然可以啊,只要你能不弄错先后,知道自己改的是什么,修改完后恢复栈顶指针,完全可以修改栈数据,这也是种hack技术,不过这对编程技术要求很高,很危险,一不小心就会导致程序崩溃,然后你都不知道错在哪里。
其实,你可以编写一个简单的函数,在main中调用它,编译后设置断点,然后调试运行,执行到断点处停止后,在调试菜单内选择反汇编观察这段代码,你会发现,编译器会在真正执行函数前都会安排一段指令修改栈数据的。
如下
void fun()
{
00164810 push ebp //基指针入栈备份
00164811 mov ebp,esp //栈顶指针赋值给基指针备用
00164813 sub esp,0C0h //修改栈顶,上移C0个字节,留出空间给临时变量
00164819 push ebx //地址寄存器入栈备份
0016481A push esi //源址寄存器入栈备份
0016481B push edi //目的寄存器入栈备份
0016481C lea edi,[ebp-0C0h] //原栈顶指针向上偏移C0个字节作为目的地址存入目的寄存器,注意此时ebp包含的是栈顶指针
00164822 mov ecx,30h//设置循环次数,每次赋值一个双字,即4字节,所以4*30h正好为C0个字节。
00164827 mov eax,0CCCCCCCCh //设置填充值,4个字节的cc,cc为中断指令3,即int 3,防止程序意外跳转到该临时数据区执行时会调用系统中断#3处理
0016482C rep stos dword ptr es:[edi]//执行循环填充数据
热心网友
时间:2022-06-27 05:49
不行 因为要遵循先进后出的原则
热心网友
时间:2022-06-27 05:49
我靠~~~~~~~这么专业的知识~~~~~~~~~~~~~~~~~~~~~