【问题标题】:Why do these syscalls do nothing?为什么这些系统调用什么都不做?
【发布时间】:2018-04-29 22:49:07
【问题描述】:

我要写一些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())(至少我希望如此)。它不会使程序崩溃或搞砸任何事情,问题是它不做任何事情。例如,我把执行 /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 吗?

【问题讨论】:

  • 您只设置了al 而不是eax。据推测,最高位包含一些之前的垃圾。其实4294957257=0xFFFFD8C9 这样你就可以看到垃圾了。
  • 哇,我觉得自己很笨。 xor %eax, %eax 在每个系统调用修复它之后。
  • before 每个mov%al 都是你真正需要的;在实际的 shellcode 中,你不能依赖 %eax 在进入你的有效载荷时为零。

标签: assembly x86 shellcode


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-12-08
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2018-07-13
    • 2019-04-05
    相关资源
    最近更新 更多