C 不溢出的缓冲区溢出

C 不溢出的缓冲区溢出,c,buffer-overflow,C,Buffer Overflow,我目前正在从《剥削的艺术》一书中学习剥削。开发部分的第一段代码基本上教会了我一个非常基本的溢出。这是书中的代码: 包括 包括 int main argc,char*argv[]{ int值=5; 字符缓冲区_-one[8],缓冲区_-two[8]; strcpybuffer_one,one;/*将一个放入buffer_one*/ strcpybuffer_二,二;/*将二放入buffer二*/ printf[BEFORE]buffer\u two位于%p,包含\'%s\'\n、buffer\u

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

包括 包括 int main argc,char*argv[]{ int值=5; 字符缓冲区_-one[8],缓冲区_-two[8]; strcpybuffer_one,one;/*将一个放入buffer_one*/ strcpybuffer_二,二;/*将二放入buffer二*/ printf[BEFORE]buffer\u two位于%p,包含\'%s\'\n、buffer\u two、buffer\u two; printf[BEFORE]buffer\u one位于%p,包含\'%s\'\n、buffer\u one、buffer\u one; printf[BEFORE]值位于%p,为%d 0x%08x\n,&value,value,value; printf\n[STRCPY]正在将%d个字节复制到缓冲区\u two\n\n strenargv[1]; strcpybuffer_-two,argv[1];/*将第一个参数复制到buffer_-two中*/ printf[AFTER]buffer\u two位于%p,包含\'%s\'\n、buffer\u two、buffer\u two; printf[AFTER]buffer\u one位于%p,包含\'%s\'\n、buffer\u one、buffer\u one; printf[AFTER]值位于%p,为%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_一个应该包含90个而不是一个。我注意到我的偏移量是16个字节,而不是8个字节0x7ffc97c28ac0和0x7ffc97c28ad0,这就是为什么if不会溢出到缓冲区1。知道我应该调查什么吗?这是一个非常严重的问题吗

[AFTER]buffer_一个应该包含90个而不是一个

不,不,一千次不。它不应该有任何特别的价值。你所做的是未定义的行为,其结果可能是任何事情,包括它完美地工作

事实上,如果您检查两个地址0x7ffc97c28ac0和0x7ffc97c28ad0,您将看到它们相隔16个字节,而不是8个a。实现完全可以做到这一点,因为它唯一的责任是至少满足您的要求。这意味着strcpy中还需要几个字节才能溢出缓冲区

一个可能的原因是,对于64位体系结构,在16字节边界上对齐项可能更有效。地址是48位而不是32位的事实似乎表明这是正确的。你的书很可能是用32位系统写的


但我强调这只是一个可能的原因。利用此漏洞需要非常深入地了解您所处的环境。

它不会溢出,因为缓冲区2在内存中的位置低于缓冲区1。因此,必须将argv[1]复制到buffer\u one中,使其溢出buffer\u two

buffer\u one 0x01->buffer\u two 0x02-溢出的buffer\u two不会更改buffer\u one

strcpybuffer_one,argv[1];/*将第一个参数复制到缓冲区中*/
内存不是静态的,本书中发生的事情与其他机器中发生的事情不同。

本书是否指导您为x64编译?它是否指定了特定的编译器、版本和标志?您使用的编译器可能与作者使用的编译器不同。您可能还注意到,您复制的程序内容是9个字节-您认为它应该复制10个字节。只是基本的gcc-o overflow\u example overflow\u example.c,我添加了in-fno stack protector,因为没有它,它检测堆栈崩溃。为什么不尝试使用-S开关并检查程序集来查看编译器在做什么?请注意,缓冲区相隔16个字节-地址0x…C0和0x…D0。你需要比9或10字节更长的字符串才能在它们之间溢出。但是,但是,有一本书说它应该做到这一点!我想我明白你的意思了:我最好是这样想,而不是书上说应该这样做。谢谢大家的帮助,这个noob还有很长的路要走