缓冲区溢出攻击实验,意想不到的结果
问题描述:
我做的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的值。但我不知道为什么“价值”的价值是影响
答
在你的攻击实验中,你似乎已经失去了跟踪缓冲器和可变的顺序。
你的输出(与代码中的变量声明一起)清楚地示出:
- buffer_two,大小为8,地址0X ... 0℃
- buffer_one,大小为8,地址0X ... 14
- 值,大小为4,地址为0x ... 1C
(值的大小是猜测,但不相关的,假设它有LSB的最低字节地址。)
当buffer_two溢出由9个字节,这将完全填充buffer_one,与的值为“1” == 49和第二字节的值第一字节为0。
要重复,所有的即,严格地说,UB和为此野生猜测。但这是正常的利用环境,你可能已经意识到了这一点。
为什么你认为'value'严格绝不能受到影响?该标准是否需要针对自动变量的特定内存布局? – zerkms
您有缓冲区溢出,导致未定义的行为。一切皆有可能。这个问题并不有趣,因为代码有UB。 –
我投票结束这个问题作为题外话,因为它是关于无趣的未定义的行为。 –