【问题标题】:Buffer overflow exploitation 101缓冲区溢出利用 101
【发布时间】:2018-03-25 09:20:21
【问题描述】:

我在很多地方都听说过缓冲区溢出,类 C 语言中的非法索引可能会危及系统的安全性。但根据我的经验,它所做的只是让我正在运行的程序崩溃。谁能解释缓冲区溢出如何导致安全问题?举个例子就好了。

我正在寻找一个关于这样的事情如何工作的概念性解释。我没有任何道德黑客的经验。

【问题讨论】:

    标签: security buffer-overflow exploit


    【解决方案1】:

    首先,缓冲区溢出(BOF)只是获得代码执行的方法之一。当它们发生时,影响是攻击者基本上获得了对该过程的控制。这意味着攻击者将能够触发进程以当前进程权限执行任何代码(取决于进程是否以系统上的高权限或低权限用户运行,将分别增加或减少利用 BOF 对该应用程序)。这就是为什么始终强烈建议以最少需要的权限运行应用程序的原因。

    基本上,要了解 BOF 的工作原理,您必须了解您构建的代码如何编译成机器代码 (ASM),以及软件管理的数据如何存储在内存中。

    我将尝试为您提供一个称为基于堆栈的缓冲区溢出的 BOF 子类别的基本示例:

    假设您有一个应用程序要求用户提供用户名。 该数据将从用户输入中读取,然后存储在名为USERNAME 的变量中。此可变长度已分配为 20 字节的字符数组。

    为了使这种情况正常工作,我们将考虑程序不检查用户输入长度。

    在某些时候,在数据处理过程中,用户输入会被复制到USERNAME 变量(20 字节),但由于用户输入较长(比如说 500 字节),因此该变量周围的数据将在内存中被覆盖:

    想象一下这样的内存布局:

    size in bytes     20         4          4            4  
    data          [USERNAME][variable2][variable3][RETURN ADDRESS]
    

    如果您定义了 3 个局部变量 USERNAMEvariable2variable3,则可能会以上面显示的方式存储在内存中。

    注意RETURN ADDRESS,这个 4 字节的内存区域将存储调用当前函数的函数的地址(因此,当您在程序中调用函数并读取该函数的结尾时,程序在初始调用该函数之后,流程自然会返回到下一条指令。

    如果您的攻击者提供的用户名包含 24 x 'A' 字符,则内存布局会变成这样:

    size in bytes     20         4          4            4  
    data          [USERNAME][variable2][variable3][RETURN ADDRESS]
    new data      [AAA...AA][   AAAA  ][variable3][RETURN ADDRESS]
    

    现在,如果攻击者发送 50 * 'A' 字符作为 USERNAME,内存布局将如下所示:

    size in bytes     20         4          4            4  
    data          [USERNAME][variable2][variable3][RETURN ADDRESS]
    new data      [AAA...AA][   AAAA  ][   AAAA  ][[   AAAA      ][OTHER AAA...]
    

    在这种情况下,在函数执行结束时,程序会崩溃,因为它会尝试到达地址无效的地址 0x41414141 (char 'A' = 0x41),因为覆盖的RETURN ADDRESS 不会匹配正确的代码地址。

    如果您将多个“A”替换为经过深思熟虑的字节,您也许可以:

    • RETURN ADDRESS 覆盖到一个有趣的位置。
    • 将“可执行代码”放在前 20 + 4 + 4 个字节中

    例如,您可以将RETURN ADDRESS 设置为USERNAME 变量的第一个字节的地址(由于已添加到操作系统和已编译程序的许多保护措施,此方法几乎不再可用)。

    我知道一开始理解起来很复杂,这个解释是一个非常基本的解释。如果您想了解更多详情,请直接询问。

    我建议你看看像this one 这样的教程,这些教程非常先进但更现实

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-07
      • 2010-10-02
      • 2015-12-16
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多