我正在查看类的这个代码示例,我是缓冲区溢出的新手。如何修改这个例子以避免缓冲区溢出攻击?另外,如果有人知道有关缓冲区溢出的好文章,请发布。谢谢!
void GetProfileFor( const char *name,
char *profile,
int profileLen );
int main() {
char *profile = malloc( 1024 );
char name[128];
printf( “Enter your name: ” );
gets( name );
GetProfileFor( name, profile, 1024 );
printf( “\nYour profile: %s\n”, profile );
return 0; }
答案 0 :(得分:1)
最新的编译器正在添加堆栈保护程序,例如。金丝雀到二进制。您仍然可以溢出缓冲区,但是不能跳转到堆栈并执行shellcode等。您可以蛮力地使用canary,但这可能需要很长时间。同样,当您查看get的手册页时,在bug部分中,它说从不使用fgets
答案 1 :(得分:0)
只看你发布的代码,我找到了一行你可以改变的代码。
替换
gets(name);
与
fgets(name, 128, stdin);
gets
未检查name
的大小以决定何时停止阅读。它会尝试读取比name
有空格的更多字符。另一方面,fgets
会在遇到换行符时停止阅读,或者已读取127
个字符,以先到者为准。
答案 2 :(得分:0)
要确定缓冲区溢出的位置,您必须识别所有输入路径和它填充的缓冲区 - 内部缓冲区是否足以满足所有可能的输入?或者是否对允许的投入量施加了限制?
在你的情况下,gets(name)在内部缓冲区中有一个限制,但是gets()本身对它可以采取的输入没有限制:
http://www.tutorialspoint.com/c_standard_library/c_function_gets.htm
因此可以缓冲区溢出。
防止此攻击的具体解决方案是使用fgets():
http://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm
确实对允许的外部输入有限制。