我刚为buffer overflow inspection
写了一个简单的程序。
运行此
结果显示:
gcc -g buffer.c
./a.out Hello
----ACCESS GRANTED----
(这是预期的)
./a.out aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
----ACCESS GRANTED----
(表示溢出)
./a.out aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ----ACCESS GRANTED---- Segmentation fault
我想知道为什么在显示结果后说出分段错误。
答案 0 :(得分:1)
您的问题似乎是假设在程序终止后发生了段错误。它实际上是在执行期间发生的,最有可能是在main函数结束时执行隐式return语句。
运行C程序时,系统会在调用main函数之前进行一些初始化(通常,实际入口点是_start()
函数,_start()
调用main()
)。在内部,调用main()
函数会保存返回地址(函数结束时返回的地址)。这显然取决于CPU和编译器,但返回地址通常保存在数组p
旁边的堆栈中。在p
上执行缓冲区溢出时,您可能会覆盖返回地址,因此在main()
尝试返回时出错。很可能该程序将分支到一个不存在或不可执行的地址。
请注意,攻击者可以利用此类错误尝试跳转到指定位置并执行一段不应该执行的代码。
答案 1 :(得分:0)
您正在将用户在命令行上提供的字符串复制到太短的缓冲区,这意味着可能发生任何。在这种情况下,您根本不需要复制字符串,因为您可以直接在strcmp()
字符串上运行password
。
E.g。
checkpass(char *password)
{
return !strcmp(password, "Hello");
}
(这假设password
是以空字符结尾的字符串)