即使缓冲区足够大也会出现分段错误?
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]));
向程序确认这一点。
我正在尝试测试缓冲区溢出,但即使缓冲区足够大,程序似乎也会崩溃,我不明白为什么
#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]));
向程序确认这一点。