2011-11-13 38 views
8

È 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

+4

cosa stai cercando di ottenere esattamente?Voglio dire, forse c'è un altro modo più semplice per farlo. – Aziz

+1

Qual è il tuo sistema operativo e come stai eseguendo questo processo? È attivato dall'utente o stai chiamando da un altro processo? – ibid

+1

Non puoi semplicemente impostare 'argc = 0' come prima riga di' main() '? –

risposta

12

È 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.

+0

Ottimo, funziona. Ma qualsiasi idea su come passare argomenti e lasciare ancora argc = 0 – Keeto

+4

'argc' indica il numero di argomenti (più uno, per il nome del programma), quindi no, non è possibile. – ibid

+0

votex al lavoro haha ​​im bloccato anche –

3

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; 
} 
+0

Non sarebbe un comportamento indefinito? – user

+0

@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). –

2

È 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)?

+0

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) –

+0

Risolto, grazie. – vegafish

Problemi correlati