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 Can';不理解“中的缓冲区溢出示例”;“剥削的艺术”;_Security_Buffer Overflow_Exploit_Shellcode - Fatal编程技术网

Security Can';不理解“中的缓冲区溢出示例”;“剥削的艺术”;

Security Can';不理解“中的缓冲区溢出示例”;“剥削的艺术”;,security,buffer-overflow,exploit,shellcode,Security,Buffer Overflow,Exploit,Shellcode,我的问题非常相似,但与其他问题不同 我在书中运行了相同的利用漏洞的例子:黑客,在我的64位操作系统Archlinux上利用漏洞的艺术,但它不起作用 从上面的链接中,我了解到它无法在大多数64位系统上工作。但是我仍然不明白为什么程序必须这样做:ret=(unsigned int)&I-offset。为什么我不能这样做:ret=(未签名)外壳代码,这样我就可以用外壳代码的开始地址替换易受攻击程序的返回地址?ret=(未签名)外壳代码将使ret等于程序中外壳代码数组的地址。但该地址不是目标程序中恶意代

我的问题非常相似,但与其他问题不同

我在书中运行了相同的利用漏洞的例子:黑客,在我的64位操作系统Archlinux上利用漏洞的艺术,但它不起作用

从上面的链接中,我了解到它无法在大多数64位系统上工作。但是我仍然不明白为什么程序必须这样做:
ret=(unsigned int)&I-offset
。为什么我不能这样做:
ret=(未签名)外壳代码
,这样我就可以用外壳代码的开始地址替换易受攻击程序的返回地址?

ret=(未签名)外壳代码将使
ret
等于程序中外壳代码数组的地址。但该地址不是目标程序中恶意代码的地址(
notesearch.c
)。目标进程将把它的
searchstring
放在堆栈上,这样您的恶意代码也将放在目标进程的堆栈上

在过去,进程的内存布局通常具有高度确定性——攻击者通常可以很好地预测堆栈缓冲区的位置(特别是如果他们确切地知道目标软件的哪个版本受到攻击)。因此,很容易知道
searchstring
和外壳代码的确切地址

然而,今天,许多操作系统将执行ASLR。因此,试图执行在堆栈上注入的外壳代码的攻击者必须首先找到堆栈。系统对攻击者隐藏相关内存地址。必须猜测这些值,由于应用程序崩溃(分段错误),错误的猜测通常无法恢复

为了提高在进行一些猜测时的成功几率,活动外壳代码之前通常会有大量不执行任何有用操作的可执行机器代码,称为“NOP sled”或“NOP slide”


因此,即使是
ret=(unsigned int)&i-offset
也不能确保外壳代码能够成功执行。

&i-offset
用于链接问题(“此问题”)以获取
缓冲区的地址(变量存储在堆的…Wat上),而不是
外壳代码的地址(静态变量)但我在gdb中发现,指向的地址缓冲区比&I小得多(如果没有使用太多内存,堆地址应该比堆栈地址小得多吗?)。但示例将偏移量设置为270,我认为它假设这两个地址很接近。