其他
快速定位windows堆溢出
本文为看雪论坛优秀文章
看雪论坛作者ID:sanganlei
windows堆溢出的排查的困难
页堆结构
1、页堆结构
2、堆块结构
堆溢出调查方法一:使用页堆调查堆溢出
//堆溢出示例
//现象:输入字符长度小于等于10,程序正常运行;超过10个字符,程序会崩溃
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "dump.h"
WCHAR* pszCopy = NULL;
bool DupString(WCHAR* psz) {
bool bRet = false;
if (psz != NULL) {
pszCopy = (WCHAR*)HeapAlloc(GetProcessHeap(), 0, 10 * sizeof(WCHAR)); //10个宽字符内存
if (pszCopy) {
wcscpy(pszCopy, psz); //隐患:字符超过10个就会产生溢出
wprintf(L"Copy of string: %s", pszCopy);
HeapFree(GetProcessHeap(), 0, pszCopy);
bRet = true;
}
}
return bRet;
}
void __cdecl wmain(int argc, WCHAR* args[]) {
SetUnhandledExceptionFilter(ExceptionFilter);//异常回调,生成dump文件
if (2 == argc) {
wprintf(L"Press any key to start\n");
_getch();
DupString(args[1]);
}
else {
wprintf(L"Please enter a string");
}
}
step 1:启动完全页堆
step 2:WinDbg调试程序
1) 确定页堆是否启用
2) 触发堆溢出
step 3:关闭完全页堆
堆溢出调查方法二:应用程序验证器
step 1:应用程序验证器设置
step 2:WinDbg调试结果
看雪ID:sanganlei
https://bbs.pediy.com/user-home-917132.htm
# 往期推荐
3.House of apple 一种新的glibc中IO攻击方法
球分享
球点赞
球在看
点击“阅读原文”,了解更多!