代码混淆
缓冲区溢出
缓冲区溢出是现在安全中存在最多的问题,最危险的是堆栈溢出。
原理:简单说程序通常会设计固定大小的内存来存放用户数据等变量,比如4个格子,但是如果对输入数据不做处理判断的话,过长的数据(例如10个格子),就会出现缓冲区溢出。导致的结果就是,多出来的6个格子会覆盖原本存放其他代码的格子。
危害:缓冲区溢出会导致其他内存的代码被覆盖,造成程序崩溃数据丢失等。同时如果被恶意利用,其他内存的代码被篡改,会导致安全攻击。
注意:C语言作为早期的语言,函数风格自由容易出错,追求性能而容易忽略严谨性。比如对strcpy
和sprintf
的调用,这两个函数没有边界检查(都没有检查输入参数的长度),要注意。
边界检查:边界检查在程序设计中是指在使用某一个变量前,检查该变量是否处在一个特定范围之内。最常见的是数组的下标检查,防止下标超出数组范围而覆盖其他数据。若是边界检查未能有效发现错误,最常见的结果是程序出现异常并终止运行。
例:strcpy()
strcpy()
: strcpy() 函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目!如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会造成缓冲区溢出!
strncpy (dst, src, dst_size-1)
:如果 src 比 dst 大,则该函数不会抛出一个错误;当达到最大尺寸时,它只是停止复制字符。注意上面调用 strncpy() 中的 -1。如果 src 比 dst 长,则那给我们留有空间,将一个空字符放在 dst 数组的末尾。
使用较安全的函数,一定程度上解决了缓冲区溢出问题。
网友评论