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