钓鱼网站盗号,网站排版尺寸,中国中国建设银行网站首页,黄页网云南企业原地址#xff1a;https://blog.csdn.net/qq_31481187/article/details/73612451
原作者代码是基于linux系统的演示代码#xff0c;因为windows和Linux 内存管理机制上略有不同#xff0c;该程序在Windows需要稍微做些改动。
Windows上执行free释放malloc函数分配的内存后…原地址https://blog.csdn.net/qq_31481187/article/details/73612451
原作者代码是基于linux系统的演示代码因为windows和Linux 内存管理机制上略有不同该程序在Windows需要稍微做些改动。
Windows上执行free释放malloc函数分配的内存后内存地址一般不被收回从Windows7到Windows11都是这样这一点根Linux完全相同。Linux上再一次调用malloc后返回的是上一个fee掉的内存地址而window不同free执行后再一次执行malloc两次的内存地址不同。基于第二点代码没有再次申请内存而是直接在free掉的内存地址上修改函数指针达到了同样的效果。
源码如下
#include Windows.h#include stdio.h
#include cstdlib
#include string.h#include stdlib.h
#include conio.htypedef void (*func_ptr)(char*);void evil_fuc(char command[])
{system(command);
}void echo(char content[])
{printf(%s, content);
}int main()
{func_ptr* p1 (func_ptr*)malloc(4 * sizeof(int));printf(malloc addr: %p\n, p1);p1[3] echo;p1[3]((char*)hello world\n);free(p1); //在这里free了p1,但并未将p1置空,导致后续可以再使用p1指针p1[3]((char*)hello again\n); //p1指针未被置空,虽然free了,但仍可使用.p1[3] evil_fuc; //在这里将p1指针里面保存的echo函数指针覆盖成为了evil_func指针.p1[3]((char*)cmd /c calc.exe);_getch();return 0;func_ptr* p2 (func_ptr*)malloc(4 * sizeof(int));//malloc在free一块内存后,再次申请同样大小的指针会把刚刚释放的内存分配出来.printf(malloc addr: %p\n, p2);printf(malloc addr: %p\n, p1);//p2与p1指针指向的内存为同一地址p2[3] evil_fuc; //在这里将p1指针里面保存的echo函数指针覆盖成为了evil_func指针.p1[3]((char*)cmd /c calc.exe);return 0;
}
执行结果截图如下