假设你是安全代码审计人员并且你已经陷入了一些
像这样的代码:

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

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

最佳答案

一个明显的答案是,如果 buffer 不是至少 101 chars long,一种特殊情况是程序员忘记了空终止符也被复制(如果 buffer 正好是 100 chars long)。我可以从头顶上看到两个更微妙的攻击 vector :

  • data 可能与非可读内存接壤,并且不包含空终止符。这将导致段错误或访问冲突,但不会直接导致内存损坏。
  • databuffer 在被视为字符串时可能会重叠。在这种情况下,行为是未定义的。

  • 以第二次攻击为例,代码如下:
    #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;
    
    }
    

    这样做的可能结果是覆盖大量内存,然后出现段错误。

    关于c - 绕过内存损坏限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21066684/

    10-11 22:12
    查看更多