为什么这些系统调用什么都不做?

时间:2018-04-29 22:49:08

标签: assembly x86 shellcode

我必须编写一些shellcode,并且有一部分不起作用:

   0:   b0 c9                   mov    $0xc9,%al
   2:   cd 80                   int    $0x80
   4:   89 c3                   mov    %eax,%ebx
   6:   89 c1                   mov    %eax,%ecx
   8:   b0 cb                   mov    $0xcb,%al
   a:   cd 80                   int    $0x80

相当于setreuid(geteuid(),geteuid())(至少我希望是这样)。它不会崩溃程序或弄乱任何东西,问题是它没有任何。例如,我把shellcode执行后执行/ bin / sh并且/ bin / sh执行正常。任何与setuid相关的系统调用似乎都没有任何影响。

当我运行strace时,它会输出:

syscall_4294957257(0, 0x8048552, 0xffffd875, 0xf7fc7000, 0xf7fc7000, 0xffffd618) = -1 (errno 38)
syscall_4294967243(0xffffffda, 0xffffffda, 0xffffd875, 0xf7fc7000, 0xf7fc7000, 0xffffd618) = -1 (errno 38)
execve("/bin//sh", NULL, NULL)          = 0

我为setuid(id)getuid()获得了相同的输出。所以我想知道为什么strace认为execve是execve,而不是其他人。不应该仅仅识别setreuid

1 个答案:

答案 0 :(得分:1)

linux系统调用从x86下的EAX寄存器中读取系统调用号。通过将C9移动到AL,您只需设置EAX的底部8位,其余部分留下垃圾。这就是为什么strace调用你所做的“syscall_4294957257”:它是十六进制的FFFFD8C9。 (请注意,它以C9结尾。)这也是为什么你看到errno 38,它转换为ENOSYS“函数未实现”,换句话说,“我不知道你是什么请我做“​​。

解决方案是在设置eax之前清除al,如下所示:

31 c0                   xor    eax,eax
b0 c9                   mov    al,0xc9 
相关问题