c - C中的缓冲区溢出攻击 - 无法覆盖堆栈
问题描述
最近我在大学里做了一个关于缓冲区溢出攻击的练习。虽然我做到了,但我从一开始就有一个问题,但似乎还没有一个明确的答案。
所以:我在程序中使用了 2 种不同的输入法:
gets
功能fgetc
带函数的while循环
我在 Linux 中使用 gdb 打开可执行文件并使用相同的(大于缓冲区 [12])输入 32“A”运行它们。
我不明白的是:
使用gets
函数,堆栈被顺利覆盖,并引发分段错误:0x41414141 in ?? (),这是正常的。
在while循环中使用fgetc
函数,缓冲区通常被写入(12字节),但在那之后,虽然我给的输入是额外的20字节(32字节总和),但我看到后面跟着0x0000000a(这是'\ n' newline char) 不属于那里,但在最后。除此之外,在 0x0000000a 之后,它会跳过一些内存地址并继续用其余的输入再次覆盖堆栈。
为什么会这样?
这是源代码:
方法一:
#include <stdio.h>
void readString()
{
char buffer[12];
int i = 0;
int c;
/* Different input method */
gets(buffer);
/* End*/
puts(buffer);
}
int main()
{
puts("Please enter your name:\n");
readString();
return 0;
}
方法二:
#include <stdio.h>
void readString()
{
char buffer[12];
int i = 0;
int c;
/* Different input method */
while (1) {
c = fgetc(stdin);
if ((c == EOF) || (c == '\n'))
break;
buffer[i++] = c;
}
/* End*/
puts(buffer);
}
int main()
{
puts("Please enter your name:\n");
readString();
return 0;
}
解决方案
推荐阅读
- empirical-lang - 为什么我不能在变量上调用 load()?
- c++ - 如何改进 Lua 内部错误消息以包含行号?
- javascript - JavaScript:如何在 Chrome for iOS 上指定 blob 文件的名称?
- swift - RealityKit – arView.scene 添加 AnchorEntity
- go - gocov 不会将完整的测试覆盖结果上传到 codeclimate
- jquery - Jquery Bootstrap Accordian 常见问题解答
- algorithm - 分析确定重合虚线中的虚线是否会重叠
- android - Firebase phone auth kotlin 不会发送验证码
- javascript - Javascript禁用按钮,直到3个或更多输入字段具有值
- reactjs - 当我运行 Npm Start 时,React 页面不会在浏览器中实时更改