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

2024-07-03

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

#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 位)上,我将使用 GOT 覆盖技术来利用这一点,该技术主要包括以下步骤:

  1. 缓冲区溢出直至 RIP
  2. 用以下地址覆盖 RIPstrcpy@plt
  3. 使用干净的小工具.text, e.g. pop edi ; pop ebp ; ret,作为返回地址strcpy
  4. 写下论据strcpy: &bss-地址作为目的地和一个字节/bin/sh using .text
  5. 重复步骤2-4,直到/bin/sh已完全写入&bss
  6. 覆盖 GOT 条目strcpy with system(使用偏移量,需要了解所使用的 Libc 版本 - 让我们在这里忽略这一点)
  7. Write strcpy@plt在堆栈上,后面是一些 4 字节块,最后是地址&bss这指向/bin/sh
  8. Profit

我想在 x86-64 上利用此漏洞,并启用相同的缓解措施。但这比想象的要困难。基本上有以下几个原因:

  1. x86-64 基于寄存器的调用约定:函数参数使用寄存器传递,而不是堆栈。因此,需要一些额外的 ROP-gadget 将参数从堆栈传输到适当的寄存器中。这是一个小问题,但也受到以下问题的影响:
  2. 64位返回地址:x86-64 中的 RIP 指向.text它甚至不是 32 位长。因此,必须在堆栈上写入 NULL 字节以链接函数调用。基本上,可以使用链式调用根据需要写入尽可能多的 NULL 字节strcpy并利用 NULL 终止字符strcpy总是写。但一个人只能打电话strcpy仅覆盖 RIP 的最低有效字节一次。

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

这些是我在启用 NX 和 ASLR 的 x86-64 上利用该程序时遇到的主要问题。有什么技术可以解决这些问题吗?或者 x86-64 真的可以阻止有效的 shell 打开漏洞吗?


x86-64 无法阻止此类攻击。看到这个tutorial https://blog.techorganic.com/2015/10/09/a-rop-primer-solution-64-bit-style/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在启用 NX (DEP) 和 ASLR 的 x86-64 上利用基于字符串的溢出 的相关文章

  • bash 脚本中自动 docker 登录

    我如何提交我的凭据docker login脚本中的命令 我使用的 bash 脚本基本上自动化了设置自定义虚拟机等的整个过程 但是当我需要在脚本中登录 docker 来提取映像时 我收到以下错误 用户名 FATA 0000 设备的 ioctl
  • 对于 Linux 上的 ARM,从 *.hex 转换为 *.bin

    我想使用以下命令将程序上传到我的 STM32F4 Discovery 板st flash命令 问题是当我尝试上传 hex 或 elf 文件时 它不起作用 我尝试了多种方法 例如使用 xxd 从 elf 或 hex 转换为 bin 但当我上传
  • 此版本的 MongoDB 太新,无法在现有数据文件上启动。尝试 MongoDB 4.2 或更早版本

    我最近将 mongodb 版本从 4 2 更新到了 4 4 似乎它发生了一些重大变化 现在该服务根本没有运行 并向我显示此错误 我知道降级不是一个选择 但这有解决办法吗 提前致谢 在使用 mongodb 4 4 之前 您首先需要将数据库升级
  • 提高mmap memcpy文件读取性能

    我有一个从文件中顺序读取数据的应用程序 有些是直接从指向的指针读取mmaped 文件和其他部分是memcpyed 从文件到另一个缓冲区 我注意到在进行大型操作时性能不佳memcpy我需要的所有内存 1MB 块 以及在执行大量较小操作时的更好
  • 可以取消链接以读写方式打开的文件

    在我的程序 在 Mac OS X 上 中 我使用以下代码打开该文件 int fd fd open filename O RDWR 删除文件的程序如下 unlink filename 就我而言 我有相同的文件被打开和删除 我观察到以下情况 打
  • 如何使用recv()在C++套接字中接收超过65000字节

    我正在 Linux 中使用 C 开发客户端服务器应用程序 TCP 我想发送超过65 000同时字节 在 TCP 中 最大数据包大小为65 535仅字节 如何才能无损地发送整个字节 以下是我在服务器端的代码 Receive the messa
  • 如何使用recv()在C++套接字中接收超过65000字节

    我正在 Linux 中使用 C 开发客户端服务器应用程序 TCP 我想发送超过65 000同时字节 在 TCP 中 最大数据包大小为65 535仅字节 如何才能无损地发送整个字节 以下是我在服务器端的代码 Receive the messa
  • 标准库字符串新放置中的内存泄漏

    我在标准库字符串的新放置中面临内存泄漏 下面我给出了显示泄漏的代码 string string1 new string char string sizeof string new string string string1 使用dbx发现泄
  • 在远程机器上执行部分 shell 脚本

    我正在通过 shell 脚本登录远程计算机 通过将 ssh 命令放在脚本中 在 ssh 命令之后 脚本的其余行将在当前计算机而不是远程计算机上执行 如何使其余的 shell 脚本行在远程计算机上执行 可以说这是我的脚本 ssh userna
  • 以与 Bash 相同的方式转义文件名

    当我使用 tab 键时bash 当您开始输入文件名并希望其完成时 bash正确转义文件名 如果我完全使用 转义 文件名 它就可以工作 例如 An Beat Mentally Insine Original Mix mp3 gt 之后bash
  • “source script.sh”和“./script.sh”有什么区别?

    有什么区别source
  • 如何检测 Bash/Shell 中 GUI 的可用性?

    我正在用 NodeJS 编写一个 CLI 因为我可以使用 child process 轻松运行 bash shell 命令 所以我想知道最简单的最跨平台的方式检测 bash shell 中 GUI 的可用性 Thanks 在 macOS 上
  • linux nasm 程序集打印从 0 到 100 的所有数字

    我正在编写一个程序来打印从 0 到 100 的所有数字 我这样做的唯一原因是测试打印出多位数字 我遇到的问题是我的程序只打印出数字 1 和 2 我不知道为什么 我的编译器编译良好 没有错误 也没有链接器错误 这是我的代码 SECTION d
  • 如何使用ansible输入私钥密码

    我有流浪者virtual machine跑步 I can ssh进入它使用ssh email protected cdn cgi l email protection然后它会询问我私钥的密码 我可以输入该密码 然后它就会让我登录 但如果我使
  • 使用linux bash替换文件中两个字符串之间的文本

    我有文件 acl txt 192 168 0 1 192 168 4 5 start exceptions 192 168 3 34 192 168 6 78 end exceptions 192 168 5 55 和另一个文件 例外 19
  • Linux 共享库中缺少函数

    我支持一个 Linux 程序 该程序允许用户编写自己的基于 so 文件的插件 这些插件在运行时使用 dlopen 加载 有时 用户会忘记在 makefile 中包含包含必要函数定义的 C 文件 当插件管理器使用 dlsym 从依赖于这些缺失
  • 如何修复 Linux 上 npm 上的连接 ENETUNREACH

    我没有使用代理 我只是一个试图学习如何开发的菜鸟create react app在我的机器本地 linux 这是的输出tracepath registry npmjs org 1 LOCALHOST 0 020ms pmtu 1500 1
  • 将符号限制为 Linux 可执行文件的本地范围

    任何人都可以建议我们限制将符号导出到全局符号表的某种方法吗 提前致谢 Hi 感谢回复 实际上 我有一个可执行文件 它静态链接到第三方库 例如 ver1 a 并且还使用第三方 so 文件 该文件再次与相同的库链接 但不同版本 例如 ver2
  • chmod:如何仅向已具有执行权限的文件递归添加执行权限[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我注意到 chmod R a x为所有文件添加执行权限 而不仅仅是当前可执行的文件 有没有办法只为那些已经为用户权限设置了执行集的文件添加执行权限 U
  • 在bash脚本中输入MySQL密码

    我有一个 bash 脚本 需要在 MySQL 中执行一些操作 到目前为止我有这样的事情 bin sh read p Enter your MySQL username sqluname read sp Enter your MySQL pa

随机推荐