为什么syscall指令不执行?

时间:2016-10-07 09:32:07

标签: assembly gdb 64-bit system-calls shellcode

0x7fffffffeef8: xor    %rsi,%rsi
0x7fffffffeefb: xor    %rax,%rax   <- now rax is 0
0x7fffffffeefe: movabs $0xff978cd091969dd1,%rbx   <- rbx='/bin/dash'
0x7fffffffef08: neg    %rbx
0x7fffffffef0b: push   %rbx
0x7fffffffef0c: push   %rsp
0x7fffffffef0d: pop    %rdi   <- rdi is string
0x7fffffffef0e: mov    $0x3b,%al
0x7fffffffef10: syscall 

(gdb) stepi
0x00007fffffffef08 in ?? ()
(gdb) stepi
0x00007fffffffef0b in ?? ()
(gdb) stepi
0x00007fffffffef0c in ?? ()
(gdb) stepi
0x00007fffffffef0d in ?? ()
(gdb) stepi
0x00007fffffffef0e in ?? ()
(gdb) stepi
0x00007fffffffef10 in ?? ()
(gdb) stepi
0x00007fffffffef12 in ?? ()

0x7fffffffef10中,存在syscall指令。但是当我在GDB中使用stepi命令时,我从不执行/bin/dash。我认为这个程序集应该执行/bin/dash。我误解了吗?

我上传了完整的汇编代码。我将xor %eax, %eax更改为xor %rax, %rax

我在汇编代码中添加了xor %rdx, %rdx。但我无法得到预期的结果。

process 1993 is executing new program: /bin/dash
[Inferior 1 (process 1993) exited normally]
(gdb) 

结果是这样的,但我想要的是$而不是(gdb)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    char str[256];

    printf("Type sentence.\n");
    gets(str);
    printf("%s\n", str);
}

上面是插入了shell代码的程序。

  

我使用Linux 16.04,x64架构

1 个答案:

答案 0 :(得分:-1)

内存保护是一个非常复杂的主题,但前提是将代码与数据隔离,将一个进程与另一个进程隔离。由于 neg%rbx 是完全合法的指令,因此没有合理的理由来获取错误@ 7fffffffef08。甚至尝试在该地址执行代码也是可能的,但在这种情况下,该内存区域已映射为堆栈。因此,该区域的可执行位尚未设置,这就是您获得0x7fffffffef08 in ?? ()

的原因
  

但在其他程序中,那些汇编代码执行得当。

让我相信你已经做了一些事情来阅读该领域的代码,逻辑上认为它会起作用,但它不会。