assembly inline execve

voti
0

Recentemente ho avuto in assembly inline di GCC e avere una conoscenza di base di montaggio, ho capito come fare chiamate di sistema abbastanza bene fino a quando ho provato a fare un semplice sys_execve con uno o più argomenti. La chiamata di sistema execve funziona bene se non sto passando eventuali parametri aggiuntivi, ed esegue semplicemente il file eseguibile senza parametri quando si cerca di passare qualsiasi.

#include <stdio.h>

char *argv[]={/bin/echo,parameter test, NULL};

int main(){
  __asm__ volatile (int $0x80
          :
          :a(11), // syscall number (execve)
           b(argv[0]), // filename
           c(argv), // arguments
           d(0)); // env
  return 0;
}

Non ho idea di cosa potrebbe andare male, come ho provato questo con

execve(argv[0], argv, NULL);

e ha funzionato come previsto.

È pubblicato 27/03/2016 alle 00:27
dall'utente
In altre lingue...                            


1 risposte

voti
4

Questo è il codice a 32 bit, con 32 convenzioni bit. Compilazione usando gcc -m32e funzionerà. In alternativa, passare alla corretta versione a 64 bit come:

#include <stdio.h>

char *argv[]={"/bin/echo","parameter test", NULL};

int main(){
    int ret;
  __asm__ volatile ("syscall"
          :"=a" (ret)
          :"a"(59), // syscall number (execve)
           "D"(argv[0]), // filename
           "S"(argv), // arguments
           "d"(0) // env
          :"rcx","r11","cc");
  return 0;
}

Il vero problema è che avete 64 puntatori bit nella matrice, ma la compatibilità 32 bit interrompere utilizzare naturalmente aspetta 32 Poiters bit.

Risposto il 27/03/2016 a 16:35
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more