注入的64位shellcode不会执行系统调用

时间:2015-02-15 02:47:32

标签: c gcc assembly nasm shellcode

我目前正在尝试注入将helloworld打印到易受攻击的程序中的代码。通过将代码存储在其中一个环境变量中并覆盖rip寄存器以指向该代码,我成功地注入了代码。 这是我的汇编和操作码:

 0000000000000000 <_start>:
   0:   eb 17                   jmp    19 <stack_setup>

0000000000000002 <execute>:
   2:   48 31 c0                xor    %rax,%rax
   5:   b0 01                   mov    $0x1,%al
   7:   48 31 ff                xor    %rdi,%rdi
   a:   48 ff c7                inc    %rdi
   d:   5e                      pop    %rsi
   e:   b2 0f                   mov    $0xf,%dl
  10:   0f 05                   syscall 
  12:   b0 3c                   mov    $0x3c,%al
  14:   48 ff cf                dec    %rdi
  17:   0f 05                   syscall 

0000000000000019 <stack_setup>:
  19:   e8 e4 ff ff ff          callq  2 <execute>
  1e:   48                      rex.W
  1f:   65                      gs
  20:   6c                      insb   (%dx),%es:(%rdi)
  21:   6c                      insb   (%dx),%es:(%rdi)
  22:   6f                      outsl  %ds:(%rsi),(%dx)
  23:   2c 20                   sub    $0x20,%al
  25:   77 6f                   ja     96 <stack_setup+0x7d>
  27:   72 6c                   jb     95 <stack_setup+0x7c>
  29:   64 21 0a                and    %ecx,%fs:(%rdx)
  2c:   0d                      .byte 0xd

第19行之后的操作码用于指令db&#34; Hello,world!&#34;,0x0a,0x0d。在用gdb检查x2-x10行中的指令执行后,我注意到它正确地准备了打印字符串Hello,World的参数。但是,在执行syscall语句时,没有任何反应。对于来自x12 - x17行的指令也是如此。

我还尝试编译并链接汇编代码以独立执行它并且它正常工作。除此之外,我还使用选项

编译了易受攻击的程序
  -fno-stack-protector -z execstack

这样我就可以运行位于堆栈中的代码了。我也禁用了randomizing_va_space。我想问一下,为了让我成功执行我注入的代码,是否有一些我没做的事情?

1 个答案:

答案 0 :(得分:4)

原因可能是write系统调用返回错误代码。这可能有很多原因,但可能rdx并非都是零,所以在加载15之前你应该xor %rdx, %rdx(实际上你应该只加载14,"Hello, World!\n")。

无论如何,来自write的错误将在rax中返回,并且为负数(-errno),因此当您执行

mov    $0x3c,%al
dec    %rdi
syscall 

这将是一个无效的系统调用,errno的{​​{1}} 38将被返回。

ENOSYS无论如何,我做了

exit

我建议您使用xor %rax, %rax mov $0x3c,%al syscall 运行该程序,并从其输出中查看为什么strace确实失败。


以下是适用于我的shell代码版本:

write