Почему эти системные вызовы ничего не делают? - PullRequest
0 голосов
/ 30 апреля 2018

Мне нужно написать шелл-код, и есть одна часть, которая не работает:

   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 после этого, а / 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 голосов
/ 30 апреля 2018

Системный вызов Linux читает номер системного вызова из регистра EAX под x86. Перемещая C9 в AL, вы устанавливаете только нижние 8 бит EAX, оставляя мусор в остальных. Вот почему strace называет то, что вы сделали, «syscall_4294957257»: это FFFFD8C9 в шестнадцатеричном формате. (обратите внимание, что это заканчивается на C9.) Также вы видите, что errno 38, что переводит ENOSYS «функция не реализована», или, другими словами, «я не знаю, что вы просите меня сделать ».

Решение состоит в том, чтобы очистить eax перед установкой al, вот так:

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