缓冲区溢出怎么会成为黑客的攻击

How can a buffer-overflow be an exploit for hackers?

本文关键字:黑客 攻击 溢出 怎么会 缓冲区      更新时间:2023-10-16

我看过一段关于"缓冲区溢出漏洞"的视频。视频中的家伙写入的字节超过了数组的容量,例如:

int foo(const char* cp){
char sz[10];
strcpy(sz, cp); // consider cp is a pointer to 20 characters
return x; // some valid return statement here
}

上面如果foo用20个字符的参数调用,那么我确信它是Undefined Behavior。但他为什么说这可能是一种剥削?

  • 事实上,在C++中,我们总是强烈建议不要这样做,但这怎么可能是一个漏洞呢?谢谢

但他为什么说这可能是一个漏洞,以及如何利用?

只有一些例子:

通过简单地重写具有有意义内容的其他存储器内容。也许您的缓冲区结构后面有一个bool变量,其中包含访问权限标志。覆盖缓冲区可能会设置访问标志,而代码将提供访问权限,这不是我们的想法。

腐蚀堆栈也是一件坏事。也许您的return语句在错误的地址上运行更重要的是执行缓冲区的一些内容。

每一个搜索引擎都能找到很多这样的东西!

操纵标志访问的简单示例:

struct Check
{
char small[4];
bool accessGranted;
};  
int main()
{   
Check check{ "", false };
strcpy( check.small, "12345" );
if ( check.accessGranted )
{
std::cout << "Ubs...!" << std::endl;
}
}

BTW:我发现这篇论文有点过时但很有用:http://www.cis.syr.edu/~wedu/教学/InterCompSec/讲义_新建/Buffer_Overflow.pdf

这可能是一个漏洞,有很多条件,如果把它们都列出来,我们在这个网站上会有点太远了。基本情况很简单,但当然有很多保障措施,很难真正将其用作漏洞。为了使缓冲区变得可利用,以下是一些必须正确的事情。

  • 加载到缓冲区中的内容最终会使代码指针在缓冲区的内容上运行。这通常意味着它很大,有很多NOP
  • 缓冲区的内容包含有效的机器代码。否则你只会得到一个异常和程序崩溃。

  • 启动可利用代码的应用程序具有对该漏洞利用感兴趣的特权。操作系统有很多层,设计用来屏蔽未经验证或未签名的代码。

  • 内存使用是可预测/可训练的。现代操作系统重新定位内存,使应用程序不再保证固定的指针地址
  • 处理器控制流程是可预测/可训练的。有时,该漏洞需要"训练"处理器分支到某个条件状态

堆栈不仅包含本地变量,还包含返回地址,请参阅https://en.wikipedia.org/wiki/Call_stack

通过覆盖堆栈,您可以强制CPU跳转到您选择的位置,在发生攻击时,该位置是攻击者填充恶意代码的内存区域。

现在,计算机使用您的权限运行攻击者代码。