绕过内存损坏限制

Posted

技术标签:

【中文标题】绕过内存损坏限制【英文标题】:Bypass memory corruption limitations 【发布时间】:2014-01-30 17:54:56 【问题描述】:

假设您是安全代码审计人员,并且您已经陷入了一些 代码如下:

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

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

【问题讨论】:

buffer 是如何定义的? 你为什么不使用 strncpy 和一个基于 buffer 大小的参数而不是你有的 if 语句。 【参考方案1】:

一个明显的答案是,如果buffer 至少不是 101 chars 长,一种特殊情况是程序员忘记了空终止符也被复制(如果buffer 正好是 100 chars 长)。我能想到还有两个更微妙的攻击向量:

    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;


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

【讨论】:

以上是关于绕过内存损坏限制的主要内容,如果未能解决你的问题,请参考以下文章

怎样绕过ip限制?

DISCUZ登陆限制IP绕过

如何绕过 glsl 统一数组大小限制? [复制]

如何在 Linux 上超过 64 位 LuaJIT 的 1gb 内存限制?

绕过PHP代码执行中的过滤限制详解

暴力破解绕过token限制