基于堆栈的缓冲区溢出

Posted

技术标签:

【中文标题】基于堆栈的缓冲区溢出【英文标题】:Stackbased buffer overrun 【发布时间】:2015-12-31 13:02:50 【问题描述】:

运行我的代码时出现以下错误:

GameLauncher.exe 中 0x00BA16A0 处的未处理异常:堆栈 cookie 检测代码检测到。

我不知道是什么原因造成的。这是由以下代码引起的:

#include "stdafx.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>

int main()


    std::cout << "Which process would you like to close? (Include .exe)" << std::endl;
    wchar_t userProcessToFind;
    std::wcin.getline(&userProcessToFind, 20);

    HANDLE processSnapshot;
    DWORD processID = 0;
    PROCESSENTRY32 processEntery;
    processEntery.dwSize = sizeof(PROCESSENTRY32);

    processSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, processID);
    if(Process32First(processSnapshot, &processEntery) == TRUE)
     

        while (Process32Next(processSnapshot, &processEntery) == TRUE)
        
            if (_wcsicmp(processEntery.szExeFile, &userProcessToFind) == 0)
            
                HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processEntery.th32ProcessID);

                TerminateProcess(hProcess, 0);

                CloseHandle(hProcess);
            
        

        CloseHandle(processSnapshot);
    

    return 0;

【问题讨论】:

【参考方案1】:

wchar_t userProcessToFind;
std::wcin.getline(&userProcessToFind, 20);

您已为单个wchar_t 分配空间,但您尝试读取最多20 个字符并将其放入内存中userProcessToFind 的地址。这将导致堆栈损坏,因为您将尝试写入不属于&amp;userProcessToFind 的内存。你需要做的是创建一个像

这样的数组
wchar_t userProcessToFind[20];
std::wcin.getline(userProcessToFind, 20);

或者您可以使用std::wstring,您的代码将变为

std::wstring userProcessToFind;
std::getline(std::wcin, userProcessToFind);

这带来了不必为进程名称使用任意大小的好处,因为std::wstring 将缩放以适应输入。如果您需要将底层的wchar_t* 传递给一个函数,您可以使用std::wstring::c_str() 来获取它。

【讨论】:

非常感谢!我什至没有考虑过。你帮我省了很多麻烦:)

以上是关于基于堆栈的缓冲区溢出的主要内容,如果未能解决你的问题,请参考以下文章

堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出

缓冲区溢出的问题?

关于电脑!啥是“缓冲区溢出”?

缓冲区溢出(vs)缓冲区溢出(vs)堆栈溢出[重复]

win10系统出现缓冲区溢出怎么解决

怎么解决 LINUX 堆栈溢出内存的问题