gpt4 book ai didi

c - 不溢出的缓冲区溢出

转载 作者:行者123 更新时间:2023-11-30 14:55:39 26 4
gpt4 key购买 nike

我目前正在从《剥削的艺术》一书中学习剥削。开发部分的第一个代码基本上教会了我一个非常基本的溢出。这是书中的代码:

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one"); /* Put "one" into buffer_one. */
strcpy(buffer_two, "two"); /* Put "two" into buffer_two. */
printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[BEFORE] value is at %p and is %d (0x%08x)\n", &value, value, value);
printf("\n[STRCPY] copying %d bytes into buffer_two\n\n", strlen(argv[1]));
strcpy(buffer_two, argv[1]); /* Copy first argument into buffer_two. */
printf("[AFTER] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[AFTER] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[AFTER] value is at %p and is %d (0x%08x)\n", &value, value, value);
}

使用 argv[1] = 1234567890 执行后,我得到

[BEFORE] buffer_two is at 0x7ffc97c28ac0 and contains 'two'
[BEFORE] buffer_one is at 0x7ffc97c28ad0 and contains 'one'
[BEFORE] value is at 0x7ffc97c28adc and is 5 (0x00000005)

[STRCPY] copying 9 bytes into buffer_two

[AFTER] buffer_two is at 0x7ffc97c28ac0 and contains '1234567890'
[AFTER] buffer_one is at 0x7ffc97c28ad0 and contains 'one'
[AFTER] value is at 0x7ffc97c28adc and is 5 (0x00000005)

[AFTER] buffer_one 应该包含“90”而不是“one”。我注意到我的偏移量是 16 个字节而不是 8 个字节(0x7ffc97c28ac0 和 0x7ffc97c28ad0),这就是 if 不会溢出到 buffer_one 的原因。知道我应该调查什么吗?这是一个非常严重的问题吗?

最佳答案

[AFTER] buffer_one is supposed to contains "90" instead of "one".

不,不,一千次不。它应该具有任何特定值。您正在做的是未定义的行为,其结果可以是任何东西,包括它完美地工作。

事实上,如果您检查两个地址 0x7ffc97c28ac00x7ffc97c28ad0,您会发现它们相距 16 个字节,不是八个(a)。实现完全可以执行此操作,因为它的唯一责任是至少为您提供您所要求的内容。这意味着 strcpy 中需要更多字节才能溢出缓冲区。

<小时/>

(a) 出现这种情况的一个可能原因是,对于 64 位架构,在 16 字节边界上对齐项目可能会更有效(事实上,您的地址是 48 位而不是 32 位)似乎表明这是真的)。您的书很可能是针对 32 位系统编写的。

但我强调这只是一个可能的原因。利用需要对您所工作的环境有非常深入的了解。

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

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