linux - 获取 shell 的 shellcode,但发生段默认

标签 linux shellcode

让我先向您展示我的代码。

char shellcode[] =    
"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";


int main()
{

int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}

这是一个shell-spawning shellcode,代码来自一本书--“shellcoder's handbook”。我只是复制书中的代码,并用gcc编译它(gcc shellcode.c -o shellcode)。和我的 gcc 版本是 4.7.2,我的机器是 X86,但我在 debian 上运行它,我只是遇到段错误。

readelf -l 的输出是:

Elf file type is EXEC (Executable file)
Entry point 0x80482f0
There are 8 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x08048134 0x08048134 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x0050c 0x0050c R E 0x1000
  LOAD           0x00050c 0x0804950c 0x0804950c 0x00134 0x00138 RW  0x1000
  DYNAMIC        0x000518 0x08049518 0x08049518 0x000f0 0x000f0 RW  0x4
  NOTE           0x000148 0x08048148 0x08048148 0x00044 0x00044 R   0x4
  GNU_EH_FRAME   0x000490 0x08048490 0x08048490 0x0001c 0x0001c R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr             .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr   .eh_frame 
   03     .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 
   04     .dynamic 
   05     .note.ABI-tag .note.gnu.build-id 
   06     .eh_frame_hdr 
   07     

好吧,够了吗?

最佳答案

您正在尝试执行位于堆栈上的代码,但您的堆栈不可执行。

GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

您肯定想使用 -z execstack 开关进行链接。并且可以肯定的是,在编译时手动禁用堆栈保护:-fno-stack-protector

你最终的 gcc 命令行应该是:

gcc -fno-stack-protector -z execstack shellcode.c -o shellcode

PS:您可能想阅读 gcc 手册页,这些标志都有很好的记录。

关于linux - 获取 shell 的 shellcode,但发生段默认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16697610/

相关文章:

arrays - 将 2 个数组与总和值进行比较

linux - 如何在 *nix 中计算没有共享库的进程内存?

linux x86 tcp bind shellcode(GAS语法)bind()不返回零

c++ - 如何注入(inject)从文件加载的shellcode?

c++ - Ubuntu 上 Eclipse 中的非自由库(用于 Surf Descriptor)的 OpenCV 编译错误

linux - 什么是绝对路径名与相对路径名

linux - 检测到文件已关闭

我可以执行驻留在数据段(ELF 二进制文件)中的代码吗?

linux - 为什么 NOP 的数量似乎会影响 shellcode 是否成功执行?

linux - connect() 函数的基本 Shellcode