2011-11-13 14 views
8

¿Es posible ejecutar un proceso cuyo argc = 0? Necesito ejecutar un programa, pero es extremadamente importante que su argc sea igual a 0. ¿Hay alguna manera de hacerlo? Intenté poner 2^32 argumentos en la línea de comando para que parezca como si argc = 0 pero hay un límite máximo para la cantidad de argumentos.ejecutando un proceso con argc = 0

+4

¿Qué estás tratando de lograr exactamente?Quiero decir, tal vez hay otra manera más simple de hacerlo. – Aziz

+1

¿Cuál es su sistema operativo y cómo está ejecutando este proceso? ¿Está activado por el usuario o estás llamando desde otro proceso? – ibid

+1

¿No puedes simplemente establecer 'argc = 0' como la primera línea de' main() '? –

Respuesta

12

Puede escribir un programa que llame directamente al exec; que le permite especificar los argumentos de la línea de comandos (incluido el nombre del programa) y la falta de los mismos.

+0

Genial, funciona. Pero cualquier idea de cómo pasar argumentos y aún dejar argc = 0 – Keeto

+4

'argc' indica el número de argumentos (más uno, para el nombre del programa), entonces no, eso no es posible. – ibid

+0

votex en el trabajo jaja estoy pegado demasiado –

3

Se puede escribir un programa C que genera/ejecutivos otro programa que no tenga argv, como:

#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

¿No sería esto un comportamiento indefinido? – user

+0

@user: en realidad no. El estándar trata 'argc' y' argv [0] == 0' como una situación perfectamente precisa. Ver [esta pregunta] (http://stackoverflow.com/questions/2794150/when-can-argv0-have-null). –

2

Es posible utilizar la llamada al sistema Linux execve().

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

Usted puede pasar el nombre de archivo del ejecutable y un puntero nulo como argv [] para ejecutar el binario y el argc será cero.

Es mi código de prueba:

#include <stdio.h> 
#include <unistd.h> 

int main(void) { 
    char *argv[]={ NULL }; 
    execv("./target", argv); 
    return (0); 
} 

Y el strace resultado es:

execve("./target", [], [/* 20 vars */]) = 0 

usted podría utilizar envp [] a pasar los argumentos que ha definido de todos modos.

Además, puede usar el lenguaje ensamblador para alcanzar su objetivo (argc == 0 pero aún necesita pasar argumentos). Supongo que está utilizando un entorno de 32 bits x86.

El concepto es que:

  • tienda 0x0B ($ SYS_execve) en % eax
  • poner la dirección de argv [] en % ebx
  • poner el dirección de envp [] en % ecx
  • a continuación, utilizar int 0x80 hacer una llamada al sistema

La estructura de la memoria se muestra a continuación:

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

Me pregunto que si estuviera haciendo la asignación de laboratorio del curso proporcionado por el profesor . Taesoo Kim (GATech). Enlace del curso: https://tc.gtisc.gatech.edu/cs6265

¿O es un problema de CTF (catch-the-flag contest) de hackers?

+0

Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/whats-reputation) podrá [comentar cualquier publicación] (http://stackoverflow.com/help/privileges/comment); en su lugar, [brinde respuestas que no requieran aclaración del autor de la pregunta] (http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-instead). - [De la crítica] (/ review/low-quality-posts/15041212) –

+0

Solucionado, gracias. – vegafish

Cuestiones relacionadas