Можно ли выполнить процесс, у которого argc = 0? Мне нужно выполнить программу, но чрезвычайно важно, чтобы ее argc был равен 0. Есть ли способ сделать это? Я попытался поместить в командную строку 2 ^ 32 аргумента, чтобы выглядело так, как будто argc = 0, но есть максимальное ограничение на количество аргументов.
выполнение процесса с argc = 0
Ответы (3)
Вы можете написать программу, которая напрямую вызывает exec; что позволяет указать аргументы командной строки (включая имя программы) и их отсутствие.
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 (конкурса «поймай флаг»)?
Вы можете написать программу на 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;
}
argc
и argv[0] == 0
как совершенно нормальную ситуацию. См. этот вопрос.
- person Daniel Kamil Kozar; 30.11.2015
argc = 0
в качестве первой строкиmain()
? - person Carl Norum   schedule 13.11.2011argc != 0
. Это подразумевает, что человек, который его разработал, даже не пробовал запускать его ни разу, не говоря уже о том, чтобы провести какое-либо настоящее тестирование. - person ruakh   schedule 14.11.2011