linux– 在启用了NX(DEP)和ASLR的x86-64上利用基于字符串的溢出

linux– 在启用了NX(DEP)和ASLR的x86-64上利用基于字符串的溢出,第1张

概述考虑以下易受攻击的代码/程序:#include <string.h> int main(int argc, char *argv[]) { char buf[16]; strcpy(buf, argv[1]); return 0; } 在启用了NX和ASLR的运行Linux的IA-32(x86,32位)上,我将使用GO

考虑以下易受攻击的代码/程序:

#include 

在启用了NX和ASLR的运行linux的IA-32(x86,32位)上,我将使用GOT覆盖技术来利用它,它基本上包括以下步骤:

>溢出缓冲区直到RIP
>使用strcpy @ plt的地址覆盖RIP
>使用.text中的干净小工具,例如pop edi; pop ebp; ret,作为strcpy的返回地址
>使用.text将strcpy:& bss-address的参数和/ bin / sh的一个字节写入
>重复步骤2-4,直到/ bin / sh完全写入& bss
>用系统覆盖strcpy的GOT条目(使用偏移量,需要了解libc的使用版本 – 让我们在这里忽略它)
>在堆栈上写入strcpy @ plt,然后是一些4字节的块,最后是指向/ bin / sh的& bss的地址
>利润

我想在x86-64上利用这一点,同时启用相同的缓解措施.但这更像想象的那样困难.基本上由于以下原因:

> x86-64基于寄存器的调用约定:函数参数使用寄存器而不是堆栈传递.因此,需要一些额外的ROP小工具将参数从堆栈传输到适当的寄存器中.这是一个小问题,但也受以下问题的影响:
> 64位返回地址:x86-64中的RIP指向.text,甚至不是32位长.因此,必须在堆栈上写入NulL字节以进行链函数调用.基本上,可以使用对strcpy的链接调用来编写尽可能多的NulL字节,并利用NulL终止字符strcpy始终写入.但是一个人只能通过覆盖RIP的最低有效字节来调用strcpy一次.

|0x00000000|        (most significant bytes)|0x00deadbe| <- RIP (least significant bytes)|0x41414141||0x41414141| <- SFP|   ...    | 

这些是我在启用NX和ASLR的x86-64上利用该程序时遇到的主要问题.有没有解决这些问题的技术?或者x86-64真的阻止了一个有效的shell开放漏洞吗?

最佳答案x86-64不会阻止这些类型的攻击.见这tutorial. 总结

以上是内存溢出为你收集整理的linux – 在启用了NX(DEP)和ASLR的x86-64上利用基于字符串的溢出全部内容,希望文章能够帮你解决linux – 在启用了NX(DEP)和ASLR的x86-64上利用基于字符串的溢出所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048521.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)