我正在尝试使用Visual Studio 2017在Windows 10上编译以下代码:
int main(int argc, char **argv) {
char buf[32];
strcpy(buf, argv[1]);
printf("%s\n", buf);
return 0;
}
更具体地说,我试图了解缓冲区溢出并使用此示例程序来了解实际利用。我已将构建选项配置为如下所示:
编译器选项:
/GS- /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /Fd"Debug\vc141.pdb" /Zc:inline /fp:precise /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTCu /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\buffer_overflow.pch" /diagnostics:classic
链接器选项:
/OUT:"c:\users\administrator\documents\visual studio 2017\Projects\buffer_overflow\Debug\buffer_overflow.exe" /MANIFEST /NXCOMPAT:NO /PDB:"c:\users\administrator\documents\visual studio 2017\Projects\buffer_overflow\Debug\buffer_overflow.pdb" /DYNAMICBASE:NO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG:FASTLINK /MACHINE:X86 /INCREMENTAL /PGD:"c:\users\administrator\documents\visual studio 2017\Projects\buffer_overflow\Debug\buffer_overflow.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\buffer_overflow.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /ASSEMBLYDEBUG /TLBID:1
对我来说,当我从命令行向程序提供超过32个字节的输入数据时,这似乎应该可行。但是,WinDBG报告说,当我运行这样的程序时,检测到缓冲区溢出并采取了纠正措施。
这是不可取的,如果可能的话我想阻止这种行为。任何人都可以解释为实现这一目标需要采取的步骤吗?