调用栈相关。--飞雪所为

本文通过几个具体的C++代码示例介绍了如何故意使程序崩溃的方法。通过对指针和内存的非法操作来触发程序错误,包括修改内存地址和篡改返回地址等手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C/C++ code
class Test { public: int i; int j; }; void crashme(Test* t) { // ?? 在这里干点什么能让下面的代码崩溃 } int main(int argc, char** argv) { Test *t = new Test; crashme(t); t->i = 4; // 要求程序在这里出错崩溃 }
1. #include <windows.h> void crashme(Test* t) { int v = 123; WriteProcessMemory(GetCurrentProcess(), (void*)(*((int*)&t-1) + 8), &v, 1, NULL); //相当于动态修程序的代码 } 2. void __stdcall crashme(Test* t) { *((int*)&t-1) += 9; //修改返回地址,如果是cdecl的话esp不方便修复... } int main(int argc, char** argv) { Test *t = new Test; t->i = 123; crashme(t); t->i = 4; cout <<t->i <<endl;// 输出的不是4 return 0; }



在crashme函数中对t做点什么破坏可以让t在下一次使用时会引起程序崩溃?

直觉上delete t似乎就可以,但实际上并不会引起崩溃。不知还能干点什么破坏t的内容。。。

 

*(int*)(*((int*)&t - 2) - 4) = 0;
注释一下:
&t为参数地址
(int*)&t - 1为返回的eip的地址
(int*)&t - 2为存储主调函数ebp的地址
(*((int*)&t - 2)为主调函数ebp的值
(*((int*)&t - 2) - 4)为主调函数中t的地址
*(int*)(*((int*)&t - 2) - 4) = 0;让主调函数中的t为0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值