我知道普通代码有可能溢出:
字符字符串[9];
scanf("%s", 字符串)。
但是是否有可能溢出 scanf("%8s", string)?8只是一个例子。
我知道“%8s”就像一个分隔符,但我也注意到当我输入超过 8 个字符的字符串时,程序将因以下原因终止:
* 检测到堆栈粉碎 * : ./a.out 终止
======= 回溯:=========
...
显然,默认情况下,有一个标志可以检测 GCC 打开的堆栈粉碎。既然这是一个堆栈粉碎,那么我的猜测是仍然有可能溢出并执行任意代码。
与破坏 scanf("%s") 调用者的正常溢出相反,如果 scanf("%8s") 可以溢出,它将在 scanf 函数内溢出,以便当 scanf 尝试返回时,获得控制权。
但是 scanf 是一个需要模式切换(从用户模式切换到内核模式)的系统调用,并且在内部它会调用诸如读取到标准输入等的东西。所以不确定我们是否可以在内核模式下溢出或其他东西..
欢迎评论!!
更新>>
char string[9] 假设在上面的例子中。以下实际代码中的 char string[8]。
问题实际上是关于安全 scanf("%8s") 和由于堆栈粉碎导致的 GCC 中止之间看似矛盾的故事。
简化代码:
void foo(pass some pointer) {
char input[8];
int input_number = 0;
while (1) { // looping console
printf some info;
scanf("%8s", input);
input_number = atoi(input);
if ((strlen(input) == 1) && (strncmp(input, "q", 1) == 0)) {
input_number = -1;
}
switch (input_number) {
case -1: to quit the console if input = 'q';
default: to print info that pointer refers to;
...
}
}
}
笔记:
- foo 被其他人调用。
- 尽管字符串在带有“%8s”的实际代码中是 8 个字节,但我认为这不会导致崩溃。