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

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

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

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

 #include  #include  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; } 

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

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

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

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

 #include  #include  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 для выполнения системного вызова

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

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

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

Или это проблема с хакером CTF (catch-the-flag contest)?