выполнение процесса с argc = 0

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


person Keeto    schedule 13.11.2011    source источник
comment
чего именно вы пытаетесь достичь? Я имею в виду, может быть, есть другой, более простой способ сделать это.   -  person Aziz    schedule 13.11.2011
comment
Какая у вас операционная система и как вы выполняете этот процесс? Он активирован пользователем или вы звоните из другого процесса?   -  person ibid    schedule 13.11.2011
comment
Разве вы не можете просто установить argc = 0 в качестве первой строки main()?   -  person Carl Norum    schedule 13.11.2011
comment
также это связано: stackoverflow.com/questions/2794150 / when-can-argv0-have-null   -  person Aziz    schedule 13.11.2011
comment
Я не контролирую исходный код. Но я знаю, что в исходном коде он завершается, если argc! = 0. Я использую linux ubuntu. Я могу активировать его или вызвать из другого процесса.   -  person Keeto    schedule 13.11.2011
comment
Спасибо Азизу за ссылку, думаю может помочь   -  person Keeto    schedule 13.11.2011
comment
Вы можете изменить двоичный файл с помощью отладчика / шестнадцатеричного редактора, и это очень быстро с этим справится.   -  person Seth Carnegie    schedule 13.11.2011
comment
Я бы не стал доверять программе, которая ломается, если argc != 0. Это подразумевает, что человек, который его разработал, даже не пробовал запускать его ни разу, не говоря уже о том, чтобы провести какое-либо настоящее тестирование.   -  person ruakh    schedule 14.11.2011


Ответы (3)


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

person ibid    schedule 13.11.2011
comment
Отлично, работает. Но есть идеи, как передавать аргументы и по-прежнему оставлять argc = 0 - person Keeto; 13.11.2011
comment
argc указывает количество аргументов (плюс один для имени программы), поэтому нет, это невозможно. - person ibid; 13.11.2011

Вы можете использовать системный вызов 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 (конкурса «поймай флаг»)?

person vegafish    schedule 30.01.2017

Вы можете написать программу на 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;
}
person kennytm    schedule 13.11.2011
comment
Разве это не было бы неопределенным поведением? - person user; 03.02.2014
comment
@user: Не совсем. Стандарт рассматривает argc и argv[0] == 0 как совершенно нормальную ситуацию. См. этот вопрос. - person Daniel Kamil Kozar; 30.11.2015