gpt4 book ai didi

c - C 中的简单缓冲区溢出

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:55 28 4
gpt4 key购买 nike

所以我正在做一个练习,我试图通过使用缓冲区溢出更改相关变量来让以下程序输出 Welcome to Overflow。这是代码。

#include <stdio.h>

int main(){
int a = 10;
char c = 'X';
char array2[] = {'A', 'B', 'C', 'D', 'E', 'F'};
char array[4];
printf("please enter: \n");
scanf("%s", array);

printf("c = %c\n", c);
printf("a = %d\n", a);
printf("array = %s\n", array);
printf("array2 = %s\n", array2);
printf("array[2] = %x\n", *(array + 2));
printf("array2[3] = %x\n", array2[3]);


if (c == 'X' && a == 11999 && *(array + 2) == 0x99 - 0x34 && array2[3] == 'X') {
printf("Welcome to overflow!\n");
} else {
printf("This is normal output!\n");
}
}

我需要的是 c == 'X' && a == 11999 && *(array + 2) == 0x99 - 0x34 && array2[3] == 'X'.< br/>所以我已经让每个变量都成为我想要的,除了一个。
通过输入以下内容,我可以更改它们。我输入 "XXeXXXXXXXXB" 这会将 array[2] 更改为 65,将 array2[3] 更改为 < em>X, c'X' 但我无法更改的变量是 'a'。通过使输入 a B12 字符将 a 更改为“66”,这是十进制等效值字符“B”的。如果我输入第 13 个字符,变量 a 将更改为 char * 257 的十进制等效值。由于 a 需要为 11999,我迷路了。
我尝试将 11999 除以 257,但结果为 46.6,因此没有具有该值的字符,我什至尝试了最接近 46.6 的字符,即“.”。和 '/' 但 a 太大或太小。

为了将 a 更改为 11999,我可以在第 12 和第 13 个输入中输入什么字符?另外,如果您不想给我直截了当的答案,请指出正确的方向。

最佳答案

这是一个有趣的练习。因为您正在调用未定义的行为,所以您的问题没有一个答案,必须根据具体情况进行评估。这种攻击甚至可能在某些机器上不起作用。

首先,对于这种测试,您应该使用 printf 来查看数据在哪里:

printf("a is at %p\n", &a);
printf("array is at %p\n", array);
...

这应该让您了解需要偏移多少字节。接下来确定您是在小端还是大端系统上工作。如果您使用的是小端,则 11999 为 0xDF2E0000,如果您使用的是大端,则为倒序。

所以给定你的程序在一个小端系统上,假设所有数据在内存中的顺序都是正确的,并且整数是 4 个字节,你需要字符串“--”+(0x99-0x34) + "-...X..X"+ 0xDF2E0000

编辑:这个字符串的原因如下:

  • 前 4 个字节:“--e-”填充您的输入数组
  • 接下来的 6 个字节:“...X..X”填充 array2 和 c,X 的正确位置
  • 最后 4 个字节:0xDF2E0000 用 11999 填充您的 int(小端)

您可以通过添加来测试:

#include <string.h>
char str[] = {16};
sprintf(str, "--%c-...X..X%c%c\0\0", 0x99 - 0x34, 0xDF, 0x2E);
memcpy(array, str, 14);
printf("The string is: \"%s\"", str);

代替你的scanf。显然,您可以找出与这些值关联的字符并将它们粘贴进去,但这是获取正确数据的最快方法。

当然,这是基于系统的主观更改,我上面的代码甚至可能无法在您的机器上运行。这仍然是一件非常真实的事情,并且很好地展示了为什么你应该始终限制你正在阅读和写作的字符数,以及确保你使用正确的结尾字符。

如果我遗漏了上述任何假设/因素,如果有人告诉我以便我添加它们,我将不胜感激。

关于c - C 中的简单缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47778828/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com