выполнение процесса с argc = 0 - PullRequest
9 голосов
/ 13 ноября 2011

Возможно ли выполнить процесс с argc = 0?Мне нужно выполнить программу, но крайне важно, чтобы ее argc был равен 0. Есть ли способ сделать это?Я попытался поместить 2 ^ 32 аргумента в командную строку, чтобы она выглядела так, как будто argc = 0, но максимальное количество аргументов ограничено.

Ответы [ 3 ]

12 голосов
/ 13 ноября 2011

Вы можете написать программу, которая вызывает exec напрямую; это позволяет вам указать аргументы командной строки (включая имя программы) и их отсутствие.

3 голосов
/ 30 января 2017

Вы можете использовать системный вызов linux execve () .

int execve(const char *filename, char *const argv[], char *const envp[]);

Вы можете передать имя файла исполняемого файла и нулевой указатель как argv [] , чтобы выполнить двоичный файл, и argc будет равен нулю. *

Это мой тестовый код:

#include <stdio.h>
#include <unistd.h>

int main( void ) {
    char *argv[]={ NULL };
    execv( "./target", argv );
    return ( 0 );
}

И результат strace :

execve("./target", [], [/* 20 vars */]) = 0

Вы можете использовать envp [] для передачи аргументов, которые вы определили в любом случае.

Кроме того, вы можете использовать язык ассемблера для достижения своей цели (argc == 0, но вам все равно нужно передавать аргументы). Я предполагаю, что вы используете 32-битную среду x86.

Концепция такова:

  • сохранить 0x0b ($ SYS_execve) в % eax
  • введите адрес argv [] в % ebx
  • введите адрес envp [] в % ecx
  • затем используйте int 0x80 , чтобы сделать системный вызов

Структура памяти показана ниже:

+--------------------------------------------------+     
|               +----------------------------------|-----+
v               v               v------------------|-----|-----+
[arg_0][\0][...][arg_1][\0][...][arg_2][\0][...][ptr0][ptr1][ptr2][\0]
                                                ^
                                                |   (argv[] = NULL)
                                                +--- envp

Мне интересно, если бы вы выполняли лабораторное задание по курсу, предложенному профессором Таесоо Ким (GATech). Ссылка на курс: https://tc.gtisc.gatech.edu/cs6265

Или это проблема хакерского CTF (состязания под флагом)?

3 голосов
/ 13 ноября 2011

Вы можете написать программу на C, которая порождает / исполняет другую программу без argv, например:

#include <spawn.h>
#include <stdlib.h>

int main(int argc, char** argv, char** envp)
{
    pid_t pid;
    char* zero_argv[] = {NULL};
    posix_spawn(&pid, "./that_app", NULL, NULL, zero_argv, envp);

    int status;
    waitpid(&pid, &status, NULL);
    return 0;
}
...