C - Ausführen von Bash-Befehlen mit Execvp

8

Ich möchte ein Programm Shellcode.c schreiben, das in Eingabe eine Textdatei akzeptiert, die Bash-Befehle enthält, die durch Zeilenumbruch getrennt sind, und führt alle Befehle in der Textdatei aus: die Textdatei enthält zum Beispiel:

%Vor%

Ich habe es versucht (nur um mit einer der exec-Funktionen zu üben):

%Vor%

Ich bekomme dafür

%Vor%

Ich bleibe bei der execvp-Funktion stecken, wo bin ich falsch gelaufen?

    
elmazzun 03.01.2013, 14:39
quelle

3 Antworten

18

Sie machen es falsch.

Der erste Array-Index ist der Name des Programms, wie in den Dokumenten erklärt :

  

Die Funktionen execv (), execvp () und execvpe () stellen ein Array von Zeigern auf nullterminierte Strings bereit, die die für das neue Programm verfügbare Argumentliste darstellen. Das erste Argument sollte per Konvention auf den Dateinamen verweisen, der der ausgeführten Datei zugeordnet ist. Das Array von Zeigern muss mit einem NULL-Zeiger beendet werden.

Außerdem erwartet bash kein Freiformargument wie dieses. Sie müssen ihm sagen, dass Sie Befehle mit der Option -c übergeben werden:

Du brauchst also:

%Vor%     
unwind 03.01.2013, 14:43
quelle
8

Um ein Skript an bash in der Befehlszeile zu übergeben, müssen Sie die Option '-c' hinzufügen und das gesamte Skript als eine einzige Zeichenfolge übergeben, d. h.

%Vor%     
datenwolf 03.01.2013 14:44
quelle
7

Viele Probleme hier: Die exec() Familie von Funktionen wird nicht ausgeführt Mehrere Programme - diese Funktionen führen ein einzelnes Programm aus und ersetzen den aktuell ausgeführten Prozess im Speicher mit dem neuen Programm. Das mit null Zeiger endende Array von Strings, die Sie an execvp übergeben, soll die Befehlszeilen Argumente für das von execvp ausgeführte Programm enthalten.

Wenn Sie mehrere Programme ausführen möchten, müssen Sie jede Zeile durchlaufen und die Programme nacheinander ausführen. Sie können jedoch execvp nicht verwenden, da dies sofort den gerade ausgeführten Prozess (Ihr C-Programm) durch den Prozess ersetzt, der über die Shell ausgeführt wird, was bedeutet, dass der Rest Ihres C-Programms niemals ausgeführt wird. Sie müssen lernen, wie Sie fork() kombiniert mit execvp verwenden können kann untergeordnete Prozesse ausführen. Sie rufen zuerst fork() auf, um einen untergeordneten Prozess zu erstellen, und anschließend rufen Sie %% vom untergeordneten Prozess execvp auf. Fork + Exec ist eine gängige Strategie in UNIX-Umgebungen, um andere Prozesse von einem übergeordneten Prozess aus zu starten.

    
Charles Salvia 03.01.2013 14:43
quelle

Tags und Links