c shellcode:如何使用syscall

时间:2016-09-02 12:07:07

标签: gdb x86-64 system-calls inline-assembly shellcode

我尝试用syscall

创建shell代码
void main()
{
    __asm__ __volatile__
    (
     "movq $0x0068732f6e69622f, %rdx \n\t"
     "pushq %rdx \n\t"
     "movq $0x3b, %rax \n\t"
     "movq %rsp, %rdi \n\t"
     "movq %rsp, %rdx \n\t"
     "pushq %rdi \n\t"
     "lea 0x0(%rsp), %rsi \n\t"
     "movq $0x2a, %r10 \n\t"
     "movq $0x2, %r8 \n\t"
     "movq $0x6, %r9 \n\t"
     "syscall \n\t"
     "pop %rdi \n\t"
     "pop %rdx \n\t"
     );
}

这是我的来源

编译成功。

但它没有执行我瞄准的sh功能

代码是否有任何问题???

1 个答案:

答案 0 :(得分:0)

试试这个,取自here并稍稍煽动起来。

void main()
{
    __asm__ __volatile__
    (
      "xor %rdi,%rdi \n\t"
      "push %rdi \n\t"
      "push %rdi \n\t"
      "pop %rsi \n\t"
      "pop %rdx \n\t"
      "movq $0x68732f6e69622f2f,%rdi \n\t"
      "shr $0x08,%rdi \n\t"
      "push %rdi \n\t"
      "push %rsp \n\t"       
      "pop %rdi \n\t" 
      "push $0x3b \n\t"
      "pop %rax \n\t"          
      "syscall \n\t"
     );
}

您的汇编程序类似,但似乎在$ rdi和$ rdx加载时出错。工作代码在系统调用之前将它们设置为NULL(0)。这个link表示exec调用有三个参数,显然后两个参数可以为空。

我使用您的代码完成了设置并且它有效!

void main()
{
    __asm__ __volatile__
    (
     "movq $0x0068732f6e69622f, %rdx \n\t"
     "pushq %rdx \n\t"
     "movq $0x3b, %rax \n\t"
     "movq %rsp, %rdi \n\t"
     "movq %rsp, %rdx \n\t"
     "pushq %rdi \n\t"
     "lea 0x0(%rsp), %rsi \n\t"
     "movq $0x2a, %r10 \n\t"
     "movq $0x2, %r8 \n\t"
     "movq $0x6, %r9 \n\t"
     "movq $0x0, %rsi \n\t"
     "movq $0x0, %rdx \n\t"
     "syscall \n\t"
     "pop %rdi \n\t"
     "pop %rdx \n\t"
     );
}

有趣的小谜题,让我有机会刷新我的汇编程序:)