小编Pro*_*iol的帖子

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

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

#include <string.h>

int main(int argc, char *argv[]) {
    char buf[16];
    strcpy(buf, argv[1]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 溢出缓冲区直到RIP
  2. 使用地址覆盖RIP strcpy@plt
  3. 使用干净的小工具.text,例如pop edi ; pop ebp ; ret,作为返回地址strcpy
  4. 写入以下参数strcpy:&bss-address as destination和one byte of /bin/shusing.text
  5. 重复步骤2-4直到/bin/sh完全写入&bss
  6. 覆盖GOT-entry strcpywith system(使用偏移量,需要了解Libc的使用版本 - 让我们在这里忽略它)
  7. 写入strcpy@plt堆栈,然后写入一些4字节的块,最后&bss指向的地址/bin/sh
  8. 利润

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

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

    |0x00000000|        (most significant …
    Run Code Online (Sandbox Code Playgroud)

linux dep x86-64 buffer-overflow aslr

6
推荐指数
1
解决办法
1599
查看次数

为什么某些Linux x86_64系统调用需要存根?

如果试图通过sys_call_table-hooking 挂钩某些系统调用,例如sys_execve这将失败,因为它们是由存根间接调用的.为sys_execve这是stub_execve(比较上汇编代码LXR).

但这些存根有什么用呢?为什么只有某些系统调用喜欢execve(2)fork(2)需要存根,这是如何连接到x86_64的?是否存在挂钩存根系统调用(在可装入内核模块中)的解决方法?

c operating-system x86-64 system-calls linux-kernel

6
推荐指数
1
解决办法
1104
查看次数