缓冲区溢出攻击实验,意想不到的结果

问题描述:

我做的UB的特殊情况下的分析,了解通过缓冲区溢出攻击的安全漏洞的目的。缓冲区溢出攻击实验,意想不到的结果

我听不太懂的实验结果故意室内用UB proked。我相信一个缓冲区溢出(位于另一个缓冲区和我的检测器变量之间)会覆盖另一个缓冲区和检测器。

简而言之:有什么能为变量 '值' 的值49的原因后

strcpy(buffer_two, argv[1]); 

在此代码:

#include <stdio.h> 
#include <string.h> 

int main(int argc, char *argv[]){ 
    int value = 5; 
    char buffer_one[8]; 
    char buffer_two[8]; 
    strcpy(buffer_one, "one"); 
    strcpy(buffer_two, "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("[AFTER] 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("[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("[AFTER] value is at %p and is %d (0x%08x)\n", &value, value, value); 
} 

结果:

./overflow_example AAAAAAAAAAAAAAAA1 
[BEFORE] buffer_two is at 0xbff2db0c and contains 'two' 
[BEFORE] buffer_one is at 0xbff2db14 and contains 'one' 
[BEFORE] value is at 0xbff2db1c and is 5 (0x00000005) 

[STRCPY copying 17 bytes into buffer_two 

[AFTER] buffer_two is at 0xbff2db0c and contains 'AAAAAAAAAAAAAAAA1' 
[AFTER] buffer_one is at 0xbff2db14 and contains 'AAAAAAAA1' 
[AFTER] value is at 0xbff2db1c and is 49 (0x00000031) 

内存的堆栈上去。这意味着我们重写buffer_one的值。但我不知道为什么“价值”的价值是影响

+0

为什么你认为'value'严格绝不能受到影响?该标准是否需要针对自动变量的特定内存布局? – zerkms

+0

您有缓冲区溢出,导致未定义的行为。一切皆有可能。这个问题并不有趣,因为代码有UB。 –

+5

我投票结束这个问题作为题外话,因为它是关于无趣的未定义的行为。 –

在你的攻击实验中,你似乎已经失去了跟踪缓冲器和可变的顺序。
你的输出(与代码中的变量声明一起)清楚地示出:

  • buffer_two,大小为8,地址0X ... 0℃
  • buffer_one,大小为8,地址0X ... 14
  • 值,大小为4,地址为0x ... 1C

(值的大小是猜测,但不相关的,假设它有LSB的最低字节地址。)

当buffer_two溢出由9个字节,这将完全填充buffer_one,与的值为“1” == 49和第二字节的值第一字节为0。

要重复,所有的即,严格地说,UB和为此野生猜测。但这是正常的利用环境,你可能已经意识到了这一点。