最近我在我的大学里练习过缓冲区溢出攻击。虽然我这样做了,但从一开始我就有了一个问题,但似乎没有人能够清楚地回答它。
所以:我在程序中使用了两种不同的输入法:
gets
功能
while fgetc
函数循环
我在Linux中用gdb打开可执行文件,并使用32“A”的相同(大于缓冲区[12])输入运行它们。
我不明白的事情:
使用gets
函数,堆栈被平滑覆盖,并引发分段错误:0x41414141? (),这是正常的。
在while循环中使用fgetc
函数,缓冲区正常被写入(12字节),之后 BUT ,尽管我给出的输入是额外的20字节(32字节总和) ),我看到0x0000000a跟随(它是'\ n'换行符char),它不属于那里,但最后。除此之外,在0x0000000a之后,它会跳过一些内存地址,并继续用其余的输入重写堆栈。
为什么会这样?
方法1:
#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;
}
方法2:
#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;
}