缓冲区溢出怎么会成为黑客的攻击
How can a buffer-overflow be an exploit for hackers?
我看过一段关于"缓冲区溢出漏洞"的视频。视频中的家伙写入的字节超过了数组的容量,例如:
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跳转到您选择的位置,在发生攻击时,该位置是攻击者填充恶意代码的内存区域。
现在,计算机使用您的权限运行攻击者代码。
- 黑客级别的Mini-Max Sum
- C++Brute Force攻击函数不会返回结果
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 攀登排行榜 - 黑客排名
- PostgresSQL - SQL Ready 语句与字符串转义,防止 SQL 注入攻击
- 需要帮助调试"attribute parser"!C++ 来自黑客排名的问题
- 使用堆栈从黑客等级中解决平衡括号检查的错误
- 这是一个二叉搜索树吗?黑客排名问题
- 在黑客地球上没有获得以下C ++代码问题的输出
- C++ 黑客等级 - 数组操作
- 黑客兰克中的错误比较三元组代码
- 黑客等级C++的最小最大总和
- AES ECB已知文本攻击
- 分配给阵列时出现分段错误?黑客排名 2D 阵列 - DS.
- 缓冲区溢出怎么会成为黑客的攻击
- 在C++中解决最小掉期黑客排名问题
- 优化:黑客地球邮递员软件工程师实习生问题
- 我在运行这个黑客排名 Gridland 地铁的解决方案时遇到分段错误
- 黑客攻击线程安全是"最佳"行动方案吗?