在不指定格式字符串的情况下做一个scanf是什么漏洞?
例子:
scanf(variable);
这里的漏洞通常在本质上是非常技术性的,但问题是该scanf
函数将读取的值应写入的地址作为参数。如果你没有向函数传递足够的参数来指定它们应该去哪里,或者你提供了错误类型的参数,那么恶意攻击者可以制作一个格式字符串,scanf
以便将读入的值写入内存中控制的位置敏感的信息。例如,实现函数的最常见方式是将函数返回后下一条要执行的指令的地址存储在堆栈的某个位置。如果攻击者能够以某种方式将数据写入此地址,他们就可以更改函数返回的位置。此外,如果攻击者可以将二进制数据从scanf
(也许通过输入stdin
一堆数据),理论上他们可以更改返回地址以跳转到该二进制数据中,劫持程序并使其执行攻击者选择的代码。这可能是恶意的,例如格式化硬盘驱动器的代码,或者更糟糕的是可能窃取个人信息、在计算机中添加后门等。
有关如何通过在不应该去的地方写入数据来执行通用攻击的更多信息,文章“Smashing the Stack for Fun and Profit”是一个很好的参考。它没有专门解决此类问题,但可以类似地执行此处描述的各种攻击。
希望这可以帮助!