即使缓冲区足够大也会出现分段错误?

Segmentation fault even when buffer is large enough?

我正在尝试测试缓冲区溢出,但即使缓冲区足够大,程序似乎也会崩溃,我不明白为什么

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

int bowfunc(char *string) {

    char buffer[1024];
    strcpy(buffer, string);
    return 1;
}

int main(int argc, char *argv[]) {

    bowfunc(argv[1]);
    printf("Done.\n");
    return 1;
}

with bowfun() 通过在 gdb 反汇编中减去 0x410 正确调整 rsp。 Build as gcc -o exec1 -fno-stack-protector -z execstack -g exec1.c 运行 as ./exec1 $(python3 -c "print('\xaa' * 600)") 导致崩溃,实际崩溃似乎发生在(500 到 600 字节之间)。我看不到,为什么 gdb return 这个错误

0x000055555555519e in bowfunc (string=0x7fffffffdcd4 'ª' <repeats 100 times>...) at exec1.c:10

最大命令长度和参数大小似乎也适合 xargs --show-limits </dev/null 给定:

Your environment variables take up 4531 bytes
POSIX upper limit on argument length (this system): 2090573
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2086042
Size of command buffer we are actually using: 131072
Maximum parallelism (--max-procs must be no greater): 2147483647

您的 Python 命令正在打印 1201 个字节。

$ python3 -c "print('\xaa' * 600)" | wc -c
    1201

'\xaa' 使用 UTF-8 编码打印为 2 个字节,并以换行符结尾。 $(...) 删除了换行符,但 argv[1] 仍然是 1200 字节。

添加

printf("%d\n", strlen(argv[1]));

向程序确认这一点。