当可以覆盖的字节数有限时,缓冲区溢出攻击能起作用吗?
例如,考虑一个场景,其中使用strncpy将某种文本(假设长度为27个字符,包括一个空终止符(复制到最多可包含100个字符的缓冲区中,然后使用strncat再移动100个字符。
在这种情况下,缓冲区将有127个字符,即使它在堆栈上只分配了100个字节。由于返回地址被放在堆栈的后面,我不能仅用27个字节覆盖它,有没有办法利用这种行为?也许是通过注入允许我覆盖更多字符/覆盖返回地址的程序集代码?
您正在覆盖不打算覆盖的东西。你能否利用这一点取决于程序将如何使用你重写的内存,以及你自己的独创性。
如果它只包含程序已完成使用的变量,并且在正常程序执行覆盖这些变量之前不会再次读取这些变量,那么该错误是不可利用的。
如果它包含将再次使用的变量,那么您可以看看它对它们做了什么。例如:
-
如果其中一个是
bool has_administrator_privileges
,那么您就是在做生意。 -
如果其中一个是稍后要调用的函数指针,则可以将其指向要执行的任何代码。
-
如果其中一个是将被取消引用以写入内存中某个位置的数据指针,则可以对其进行更改,以便写入其他内存。出于同样的原因,这反过来可能是有价值的。
依此类推。
但是,如果它们是无聊的变量,其值不会以任何对您有用的方式改变程序行为(例如char user_nickname[50]
(,那么您可能无法有效地利用该错误。