c - 利用缓冲区溢出读取操作

标签 c security buffer-overflow exploit

想象一下以下易受攻击的代码

int getNumber(int* array, int index) {
    return array[index];
}

 int main(int argc, char** argv) {
    int myArray = malloc(10 * sizeof(int));
    myArray[0] = 1;
    myArray[1] = 5;
    printf("%d\n", getNumber(myArray, atoi(argv[1])));
}

显然,使用 ./hello 11 运行程序将导致程序崩溃或将某些内容转储到内存中。但是,有什么方法可以利用这个程序运行任意代码(以程序的权限)?或者从这种类型的漏洞利用中实现代码执行的唯一方法是使用它来获取可以反汇编为完整代码库的内存转储?

最佳答案

undefined behavior .

你可以对堆和编译器的实现方式做一些大致的猜测。在该边界内,您可能会将影响范围限制在“有多糟糕”可能能够得到(崩溃,通常是为此)。但除了猜测之外……要有效破解,您需要进行反汇编以了解编译器为该代码生成了哪些指令……并有大量关于系统的数据可以与之对齐。

如果您对程序有更广泛的了解,并且在操作系统信任的沙盒范围内,程序员没有预料到您可以修改但您设法修改的一些变量,则可能会被利用。您向我们展示了一个非常短的程序,不太可能有太多可利用的地方。但是如果它是一个更大的程序,具有更多的功能,并且在某处声明了 int privilegeLevel = 2;...您可能会在程序的进程边界内进行管理以覆盖 privilegeLevel到 1 (让我们想象一下,它为您提供了比预期更多的功能,更低 = 更好)。然后,您正在利用基于相信它没有此类错误而给予该程序的某种程度的信任。

基本上:能够在内存中写入随机垃圾只有在你可以在某个地方写入某些东西看到并作用的地方时才有值(value)。大多数现代系统将代码和数据段以及进程彼此分开。因此,能够弄清楚 argv 的魔数(Magic Number)是什么会让您将字节戳到它们将被执行(作为指令)或由另一个进程执行(作为数据)的地方的可能性很小。

最简单的利用通常就是“我们让你崩溃了”。但是系统越原始,你就越有可能找到程序加载自身的偏移量,注意到 malloc 放置东西的一致属性,并且可能使用一些负数并开始写入内核或代码。在更复杂的系统中,任意执行需要更多的漏洞,而不是孤立的这么小的东西。

我在提供此类建议时遵循“信息是好的”政策。有道德。

关于c - 利用缓冲区溢出读取操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27141300/

相关文章:

c - 脚本只读取文件的偶数行

asp.net-mvc - 如何在 ASP.NET MVC 中要求 X.509 证书身份验证?

security - 为什么使用具有 CBC 模式的非随机 IV 会存在漏洞?

c - ret2eax 的问题

c - 使用局部变量查找函数的返回地址

c - scanf() 函数中 % 符号后的 # 符号是什么意思?

c - c 中处理 scanf 的段错误

c - 我要打印什么地址?

c - 无法理解部分代码

javascript - 授予对框架外部站点的位置访问权限