利用缓冲区溢出读取操作

时间:2014-11-26 04:23:15

标签: 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运行程序会导致程序崩溃或将某些内容转储到内存中。但是,有没有办法利用这个程序来运行任意代码(在程序的特权下)?或者是从这种类型的利用中实现代码执行的唯一方法是使用它来获取可以被分解为完整代码库的内存转储?

1 个答案:

答案 0 :(得分:4)

这是undefined behavior

您可以对堆和编译器的实现方式进行一些猜测。在该边界内,您可能会将影响范围稍微限制为可能 但除了猜测......有效地破解你需要进行反汇编以了解编译器为该代码生成了什么指令......并且有大量关于系统的数据以便与之对齐。

可能的漏洞利用是,如果您对程序有更广泛的了解,并且程序员不希望您修改一些您可以修改的变量 - 在操作系统信任的沙盒范围内。你向我们展示了一个非常短的程序,不太可能有很多东西可以利用。但是如果它是一个更大的程序,具有更多的功能,并且在某处声明了int privilegeLevel = 2; ...你可以在程序的进程边界内管理以覆盖privilegeLevel到1 (让我们假设给出你的能力超出预期,更低=更好)。然后,你会利用某种程度的信任,基于它没有这样的错误的信念。

基本上:能够在内存中编写随机垃圾只是有价值的,如果你可以写某个东西看到并作用于某个地方。大多数现代系统将代码和数据段以及彼此的进程分开。因此,能够找出argv的神奇数字的可能性很小,可以让你在某个地方戳戳它们将被执行(作为指令)或被另一个进程作为(作为数据)。

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

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