绕过内存损坏限制

时间:2014-01-11 19:12:52

标签: c security audit

假设您是安全代码审核人,并且您已经遇到了一些问题 像这样的代码:

if(strlen(data) < 100) {
     strcpy(buffer, data);
}

为了破坏缓冲区你会怎么做? 那可能吗?如果是这样,怎么样?为什么不使用该条件进行代码安全?

1 个答案:

答案 0 :(得分:5)

一个明显的答案是buffer长度不是 101 chars,具体情况是程序员忘记复制了null终结符同样(如果buffer完全 100 chars长)。我可以从头顶看到两个更微妙的攻击向量:

  1. data可能与非可读内存接壤,不包含空终止符。这会导致分段错误或访问冲突,但不会直接导致内存损坏。

  2. databuffer在被视为字符串时可能会重叠。在这种情况下,行为是未定义的。

  3. 作为第二次攻击的示例,请使用以下代码:

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        char someImportantString[] = "Something that should not be overwritten";
        char buffer[101] = "\0goodbye cruel world";
        char data[16] = {'h', 'e', 'l', 'l', 'o',' ','w','o','r','l','d',
                         'x','x','x','x','x'};                         
    
        if(strlen(data) < 100)
        {
             printf("Probably not good\n");
             strcpy(buffer, data);
        }
    
        return 0;
    
    }
    

    可能的结果是覆盖了大量内存,然后是分段错误。