È possibile eseguire un processo di cui argc = 0? Ho bisogno di eseguire un programma ma è estremamente importante che il suo argc sia uguale a 0. C'è un modo per farlo? Ho provato a mettere 2^32 argomenti nella riga di comando in modo che appaia come se argc = 0 ma c'è un limite massimo al numero di argomenti.esecuzione di un processo con argc = 0
risposta
È possibile scrivere un programma che chiama direttamente exec; che ti permette di specificare gli argomenti della riga di comando (incluso il nome del programma) e la sua mancanza.
si potrebbe scrivere un programma C che genera/dirigenti l'altro programma senza argv, come:
#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;
}
Non sarebbe un comportamento indefinito? – user
@user: non proprio. Lo standard tratta 'argc' e' argv [0] == 0' come una situazione perfetta. Vedi [questa domanda] (http://stackoverflow.com/questions/2794150/when-can-argv0-have-null). –
È possibile utilizzare chiamata di sistema linux execve().
int execve(const char *filename, char *const argv[], char *const envp[]);
Si può passare il nome di eseguibile e un puntatore nullo come argv [] per eseguire il binario e l'argc sarà zero.
E 'il mio codice di prova:
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[]={ NULL };
execv("./target", argv);
return (0);
}
E il strace risultato è:
execve("./target", [], [/* 20 vars */]) = 0
si potrebbe usare envp [] per passare gli argomenti definiti in ogni modo.
Inoltre, è possibile utilizzare il linguaggio assembly per raggiungere l'obiettivo (argc == 0 ma è comunque necessario passare argomenti). Presumo che si stia utilizzando un ambiente x86 a 32 bit.
Il concetto è che:
- negozio 0x0b ($ SYS_execve) in % eax
- mettere l'indirizzo di argv [] in % ebx
- mettere il indirizzo di envp [] in % ecx
- quindi utilizzare int 0x80 di fare una chiamata di sistema
La struttura della memoria è la seguente:
+--------------------------------------------------+
| +----------------------------------|-----+
v v v------------------|-----|-----+
[arg_0][\0][...][arg_1][\0][...][arg_2][\0][...][ptr0][ptr1][ptr2][\0]
^
| (argv[] = NULL)
+--- envp
Mi chiedo che se si stesse facendo l'assegnazione di laboratorio del corso forniti dal Prof . Taesoo Kim (GATech). Link al corso: https://tc.gtisc.gatech.edu/cs6265
O è un problema di hacker CTF (catch-the-flag contest)?
Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/15041212) –
Risolto, grazie. – vegafish
cosa stai cercando di ottenere esattamente?Voglio dire, forse c'è un altro modo più semplice per farlo. – Aziz
Qual è il tuo sistema operativo e come stai eseguendo questo processo? È attivato dall'utente o stai chiamando da un altro processo? – ibid
Non puoi semplicemente impostare 'argc = 0' come prima riga di' main() '? –