Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 缓冲区溢出攻击101_Security_Buffer Overflow_Exploit - Fatal编程技术网

Security 缓冲区溢出攻击101

Security 缓冲区溢出攻击101,security,buffer-overflow,exploit,Security,Buffer Overflow,Exploit,我在很多地方听说过缓冲区溢出,类似C语言的非法索引可能会危及系统的安全性。但根据我的经验,它只会使我正在运行的程序崩溃。有人能解释一下缓冲区溢出是如何导致安全问题的吗?举个例子就好了 我在寻找一个概念性的解释,来解释这样的东西是如何工作的。我没有任何道德黑客方面的经验。首先,缓冲区溢出BOF只是获得代码执行的方法之一。当它们发生时,其影响是攻击者基本上获得了对进程的控制。这意味着攻击者将能够在使用当前进程权限执行任何代码时触发进程,这取决于该进程是否在系统上以高权限或低权限用户运行,这将分别增加

我在很多地方听说过缓冲区溢出,类似C语言的非法索引可能会危及系统的安全性。但根据我的经验,它只会使我正在运行的程序崩溃。有人能解释一下缓冲区溢出是如何导致安全问题的吗?举个例子就好了


我在寻找一个概念性的解释,来解释这样的东西是如何工作的。我没有任何道德黑客方面的经验。

首先,缓冲区溢出BOF只是获得代码执行的方法之一。当它们发生时,其影响是攻击者基本上获得了对进程的控制。这意味着攻击者将能够在使用当前进程权限执行任何代码时触发进程,这取决于该进程是否在系统上以高权限或低权限用户运行,这将分别增加或减少利用BOF对该应用程序的影响。这就是为什么强烈建议使用最少需要的权限运行应用程序

基本上,为了理解BOF是如何工作的,您必须了解您构建的代码是如何编译成机器代码ASM的,以及软件管理的数据是如何存储在内存中的

我将尝试为您提供一个称为基于堆栈的缓冲区溢出的BOF子类别的基本示例:

假设您有一个应用程序要求用户提供用户名。 这些数据将从用户输入中读取,然后存储在名为USERNAME的变量中。此可变长度已分配为20字节的字符数组

这种情况下,我们将考虑程序不检查用户输入长度。

在某些情况下,在数据处理过程中,用户输入被复制到用户名变量20bytes,但由于用户输入更长,比如说500字节,该变量周围的数据将在内存中被覆盖:

想象一下这样的内存布局:

size in bytes     20         4          4            4  
data          [USERNAME][variable2][variable3][RETURN ADDRESS]
如果定义3个局部变量USERNAME、variable2和variable3,则可能会按照上面所示的方式存储在内存中

请注意返回地址,这个4字节的内存区域将存储调用当前函数的函数的地址。由于这一点,当您在程序中调用函数并读取该函数的结尾时,程序流自然返回到该函数初始调用后的下一条指令

如果攻击者提供具有24 x“a”字符的用户名,则内存布局将如下所示:

size in bytes     20         4          4            4  
data          [USERNAME][variable2][variable3][RETURN ADDRESS]
new data      [AAA...AA][   AAAA  ][variable3][RETURN ADDRESS]
size in bytes     20         4          4            4  
data          [USERNAME][variable2][variable3][RETURN ADDRESS]
new data      [AAA...AA][   AAAA  ][   AAAA  ][[   AAAA      ][OTHER AAA...]
现在,如果攻击者发送50*个“A”字符作为用户名,内存布局如下所示:

size in bytes     20         4          4            4  
data          [USERNAME][variable2][variable3][RETURN ADDRESS]
new data      [AAA...AA][   AAAA  ][variable3][RETURN ADDRESS]
size in bytes     20         4          4            4  
data          [USERNAME][variable2][variable3][RETURN ADDRESS]
new data      [AAA...AA][   AAAA  ][   AAAA  ][[   AAAA      ][OTHER AAA...]
在这种情况下,在函数执行结束时,程序将崩溃,因为它将尝试到达无效地址0x4141 char'A'=0x41的地址,因为被覆盖的返回地址与正确的代码地址不匹配

如果将多个“A”替换为经过深思熟虑的字节,则可以:

将返回地址覆盖到感兴趣的位置。 将可执行代码放在前20+4+4字节中 例如,您可以将returnaddress设置为USERNAME变量的第一个字节的地址。由于操作系统和编译程序都添加了许多保护,这种方法基本上不再可用

我知道一开始理解起来很复杂,这是一个非常基本的解释。如果你想了解更多细节,请直接询问

我建议你看一看很好的教程,这些教程非常高级,但更现实