【发布时间】:2019-10-23 19:47:07
【问题描述】:
我开始研究软件安全,但我无法理解缓冲区溢出攻击和 ROP 攻击是什么。
据我了解,
缓冲区溢出攻击:
当缓冲区有一定大小时,填充缓冲区并添加额外的代码,以便攻击者可以执行代码中的另一个函数或他/她自己的shellcode。
ROP 攻击:
给定一个可以覆盖返回地址的输入,以便攻击者控制流程。
但两者之间的确切区别是什么?
我觉得两者都只是给出了过多的输入来覆盖不应该接近的区域。
例如,如果我有一个代码
1 #include <stdio.h>
2
3 void check(){
4 printf("overflow occurs!\n");
5 }
6
7 int main(int argc, char* argv[]){
8 char buffer[256];
9 gets(buffer);
10 printf("%s\n", buffer);
11 return 0;
12 }
并尝试通过向gets() 函数提供特定输入来执行函数check()。
这是 ROP 攻击还是缓冲区溢出攻击?
【问题讨论】:
-
缓冲区溢出:您通过在缓冲区外写入来注入一些有效负载,通常是 shellcode。 ROP:您注入目标程序(“gadgets”)中已经存在的代码片段的地址。请注意,从技术上讲,ROP 也是缓冲区溢出。
-
似乎不同开发者对“缓冲区溢出攻击”这个词的理解不同。我对这个术语的理解是,ROP 攻击是缓冲区溢出攻击的一种特殊变体。
-
你可以说缓冲区溢出是一种“传递方式”,而ROP是一种特殊的payload。
-
@Jester:我同意 Martin 的观点:缓冲区溢出(通常)是攻击者可以控制调用堆栈上的返回地址的一种方式。 (溢出其他缓冲区通常不太有趣)。包括机器代码有效负载是完全可选的,并且现在没有暗示,因为它不是唯一与缓冲区溢出有关的事情。特别是因为大多数普通系统由于不可执行堆栈而不受标准 shellcode 注入的影响。哦,我认为这个评论实际上回答了这个问题>.
标签: security assembly buffer-overflow exploit