缓冲区溢出;避免溢出攻击

时间:2014-04-13 03:10:32

标签: c buffer buffer-overflow

我正在查看类的这个代码示例,我是缓冲区溢出的新手。如何修改这个例子以避免缓冲区溢出攻击?另外,如果有人知道有关缓冲区溢出的好文章,请发布。谢谢!

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; }

3 个答案:

答案 0 :(得分:1)

最新的编译器正在添加堆栈保护程序,例如。金丝雀到二进制。您仍然可以溢出缓冲区,但是不能跳转到堆栈并执行shellcode等。您可以蛮力地使用canary,但这可能需要很长时间。同样,当您查看get的手册页时,在bug部分中,它说从不使用fgets

答案 1 :(得分:0)

只看你发布的代码,我找到了一行你可以改变的代码。

替换

gets(name);

fgets(name, 128, stdin);

gets未检查name的大小以决定何时停止阅读。它会尝试读取比name有空格的更多字符。另一方面,fgets会在遇到换行符时停止阅读,或者已读取127个字符,以先到者为准。

结帐Why gets() is bad / Buffer Overflows了解详情。

答案 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

确实对允许的外部输入有限制。