绕过内存损坏限制

假设你是安全代码审计人,你已经进入了一些
像这样的代码:

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

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

最佳答案
一个明显的答案是缓冲区的长度是否至少为101个字符,具体情况是程序员忘记复制空终止符(如果缓冲区恰好是100个字符长).我可以从头顶看到两个更微妙的攻击向量:

>数据可能在非可读内存上边界,并且不包含空终止符.这会导致分段错误或访问冲突,但不会直接导致内存损坏.
>当处理为字符串时,数据和缓冲区可能会重叠.在这种情况下,行为是未定义的.

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

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

}

可能的结果是覆盖了大量内存,然后是seg-faulting.

转载注明原文:绕过内存损坏限制 - 代码日志