C 利用缓冲区溢出读取操作

C 利用缓冲区溢出读取操作,c,security,buffer-overflow,exploit,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]

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

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
运行程序会导致程序崩溃或转储内存中的某些内容。但是,是否有任何方法可以利用此程序运行任意代码(以该程序的权限)?或者,从这种类型的利用中实现代码执行的唯一方法是使用它来获得可以分解为完整代码库的内存转储吗?

您可以对堆和编译器是如何实现的进行一些一般性猜测。在这个范围内,你可能会将影响的范围限制在“到底有多严重”的范围内(通常,这会导致崩溃)。但是,除了猜测之外……要有效地进行黑客攻击,您需要进行反汇编,以了解编译器为该代码生成了哪些指令……并且需要有大量关于系统的数据来进行整理

可能的漏洞是,如果您对程序有更广泛的了解,并且有些变量是程序员不希望您能够修改的,您可以设法修改这些变量——在操作系统信任的沙箱范围内。你给我们看了一个很短的程序,不太可能有太多东西可以利用。但是如果它是一个更大的程序,有更多的功能,并且在某个地方声明
intprivileglevel=2…您可能会在程序的进程边界内将
privileglevel
覆盖为1(让我们想象一下,这会为您提供比预期更多的功能,更低=更好)。然后你利用了对程序的某种程度的信任,这种信任是基于它没有这样的bug的信念

基本上:只有当你能在某个地方写下某件东西并对其起作用时,才能在内存中写下随机垃圾。大多数现代系统将代码和数据段以及进程彼此分离。因此,能够找出
argv
的神奇数字是什么的可能性很小,它可以让您在另一个进程执行(作为指令)或操作(作为数据)的某个地方插入字节

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

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

这很重要

您可以对堆和编译器是如何实现的进行一些一般性猜测。在这个范围内,你可能会将影响的范围限制在“到底有多严重”的范围内(通常,这会导致崩溃)。但是,除了猜测之外……要有效地进行黑客攻击,您需要进行反汇编,以了解编译器为该代码生成了哪些指令……并且需要有大量关于系统的数据来进行整理

可能的漏洞是,如果您对程序有更广泛的了解,并且有些变量是程序员不希望您能够修改的,您可以设法修改这些变量——在操作系统信任的沙箱范围内。你给我们看了一个很短的程序,不太可能有太多东西可以利用。但是如果它是一个更大的程序,有更多的功能,并且在某个地方声明
intprivileglevel=2…您可能会在程序的进程边界内将
privileglevel
覆盖为1(让我们想象一下,这会为您提供比预期更多的功能,更低=更好)。然后你利用了对程序的某种程度的信任,这种信任是基于它没有这样的bug的信念

基本上:只有当你能在某个地方写下某件东西并对其起作用时,才能在内存中写下随机垃圾。大多数现代系统将代码和数据段以及进程彼此分离。因此,能够找出
argv
的神奇数字是什么的可能性很小,它可以让您在另一个进程执行(作为指令)或操作(作为数据)的某个地方插入字节

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


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

你的意图是什么?如果你想要一个int数组,你应该做
malloc(10*sizeof(int))
@Jagannath我正在尝试破解一个高度锁定的嵌入式设备(长期目标是在其上运行某种风格的Linux)。我没有访问代码库的权限,但是今晚,我发现了一个漏洞,虽然这个漏洞相当复杂,但从概念上讲就是我这里的代码。(因此代码执行)程序和操作系统试图通过设置代码区域来防止这种情况,这样它们就不能被写入,数据区域就不能从中执行。当参数(您的)为11时,代码的作用是溢出缓冲区边界。这会导致未定义的行为,如您所知,这可能/将导致seg故障事件。因此,没有合理/可靠的方法来利用这个不进行防御性编程的例子,特别是与任何输入数据的i/o操作相关的情况。您的意图是什么?如果您想要一个int数组,您应该执行
malloc(10*sizeof(int))
@Jagannath我正在尝试破解一个高度锁定的嵌入式设备(长期目标是在其上运行某种风格的Linux)。我没有访问代码库的权限,但今天晚上,我发现了一个漏洞