无法执行 Shellcode --> (Speicherzugriffsfehler (Speicherabzug geschrieben))

2024-01-10

我有这个功能:

char code[] = "\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x05\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x68\x65\x6c\x6c\x6f";

int main(int argc, char **argv)
{
  int (*func)();
  func = (int (*)()) code;
  (int)(*func)();
}

(这段代码来自:shell代码教程 http://www.vividmachines.com/shellcode/shellcode.html)

所以我编译并执行它,但我只收到这条消息:Speicherzugriffsfehler (Speicherabzug geschrieben)。

为什么我没有收到任何回复,只有这条错误消息?

p.s.:我的系统是 ubuntu x86 电脑。 shellcode 应该可以使用它。我用 gcc 和 gcc-4.5 编译它,都是同样的错误...


Your code变量是一个数组,它是程序的一部分初始化数据(.data) 部分。当操作系统加载您的程序时,加载程序从可执行文件中读取并执行加载命令。其中一个命令是“加载以下数据(名为.data)进入内存”。

通常情况下,.data段被加载为不可执行的段,意味着那里的内存不能被执行。因此,如果您尝试通过跳转到那里来执行代码(就像您所做的那样),那么它将因分段错误而崩溃。

有几种方法可以解决这个问题。您可以告诉链接器进行.data段可执行文件(不是一个好主意)。您可以告诉编译器将code变量放入.text改为段(用于程序的所有常规代码的段)。您可以告诉编译器和链接器创建一个新的可执行段并放入code进入那个。所有这些都很棘手。

最好的解决方案是在运行时专门分配自己的可执行内存并将 shellcode 复制到其中。这完全避免了任何潜在的编译器/链接器问题,尽管它确实增加了一个小的运行时间损失。但有些操作系统不允许内存同时可写和可执行;所以你首先必须使其可写,复制 shellcode,然后使其可执行。

在运行时控制内存权限的方法是使用mprotect(2) call http://linux.die.net/man/2/mprotect。所以这里有一个好方法:

#include <string.h>
#include <sys/mman.h>

char shellcode[] = "\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x05\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x68\x65\x6c\x6c\x6f";

// Error checking omitted for expository purposes
int main(int argc, char **argv)
{
  // Allocate some read-write memory
  void *mem = mmap(0, sizeof(shellcode), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

  // Copy the shellcode into the new memory
  memcpy(mem, shellcode, sizeof(shellcode));

  // Make the memory read-execute
  mprotect(mem, sizeof(shellcode), PROT_READ|PROT_EXEC);

  // Call the shellcode
  int (*func)();
  func = (int (*)())mem;
  (int)(*func)();

  // Now, if we managed to return here, it would be prudent to clean up the memory:
  munmap(mem, sizeof(shellcode));

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

无法执行 Shellcode --> (Speicherzugriffsfehler (Speicherabzug geschrieben)) 的相关文章

随机推荐