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

Why do these syscalls do nothing?

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

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

相当于setreuid(geteuid(),geteuid())(至少我希望如此)。它不会使程序崩溃或搞砸任何事情,问题是它不会任何事情。例如,我在此之后放置了执行 /bin/sh 的 shellcode,并且 /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,而不是其他人。 strace 不应该只识别 setreuid 吗?

一个linux系统调用在x86下从EAX寄存器中读取系统调用号。通过将 C9 移动到 AL,您只设置了 EAX 的低 8 位,其余部分留下垃圾。这就是为什么 strace 调用你所做的 "syscall_4294957257":它是十六进制的 FFFFD8C9。 (请注意,它以 C9 结尾。)这也是为什么您会看到 errno 38,它转换为 ENOSYS "function not implemented",或者换句话说,"I don't know what you're asking me to do".

解决方法是在设置al之前清除eax,像这样:

31 c0                   xor    eax,eax
b0 c9                   mov    al,0xc9