Betten Sie ein ausführbares Binary in ein Shell-Skript ein

8

Zuerst habe ich bereits gegoogelt, aber nur Beispiele gefunden, bei denen eine komprimierte Datei (zB .tar.gz ) in ein Shell-Skript eingebettet ist.

Grundsätzlich, wenn ich ein C-Programm ( hello.c ) habe, das eine Zeichenfolge ausgibt, sage Hallo Welt! .

Ich kompiliere es, um eine ausführbare Binärdatei zu erhalten

%Vor%

Jetzt habe ich ein Shell-Skript testEmbed.sh

Was ich frage, ist, ob es möglich ist, die Binärdatei ( Hallo ) in das Shell-Skript einzubetten, so dass ich

ausführen kann %Vor%

es führt die zu druckende binäre Hallo Welt! aus.

Erläuterung : Eine Alternative ist, dass ich die ausführbare Datei in ein Archiv komprimiere und dann entziehe, wenn das Skript ausgeführt wird. Was ich frage ist, ob es möglich ist, das Programm ohne das Programm auszuführen.

Bis jetzt habe ich die Methode hier ausprobiert. Aber es funktioniert nicht für mich. Ich nehme an, der Autor verwendete eine andere Distribution für eine andere Architektur. Also, im Prinzip funktionierte das nicht für mich. : P

Wenn der Arbeitsablauf für ein C-Programm von einem Java jar abweicht, möchte ich das auch wissen!

    
Ankit 08.05.2012, 02:20
quelle

3 Antworten

14

Ja, das kann gemacht werden. Es ist eigentlich sehr ähnlich im Konzept zu Ihrem verknüpften Artikel. Der Trick besteht darin, uuencode zu verwenden, um die Binärdatei in ein Textformat zu codieren und sie dann an das Ende des Skripts anzuheften.

Ihr Skript wird dann so geschrieben, dass es uudecode auf sich selbst ausführt, um eine Binärdatei zu erstellen, die Berechtigungen zu ändern und dann auszuführen.

uuencode und uudecode wurden ursprünglich für das Verschieben von binärem Inhalt auf dem Vorläufer zum Internet erstellt, der binäre Informationen nicht so gut handhabt. Die Umwandlung in Text bedeutet, dass es auch als Shell-Skript versendet werden kann. Falls sich Ihre Distribution aus irgendeinem Grund beschwert, wenn Sie versuchen, uuencode auszuführen, bedeutet dies wahrscheinlich, dass Sie sie installieren müssen. Zum Beispiel unter Debian Squeeze:

%Vor%

ruft die relevanten ausführbaren Dateien für Sie ab. Hier ist der Prozess, den ich durchlaufen habe. Erstellen und kompilieren Sie zunächst Ihr C-Programm hello.c :

%Vor%

Erstellen Sie dann ein Shell-Skript testEmbed.sh , das sich selbst dekodiert:

%Vor%

Die erste rm -Anweisung zeigt, dass die Datei hello von diesem Skript neu erstellt wird und nicht von Ihrer Kompilierung übrig bleibt. Da Sie auch die Payload in der Datei benötigen, hängen Sie die codierte ausführbare Datei an das Ende der Datei an:

%Vor%

Danach, wenn Sie das Skript testEmbed.sh ausführen, wird die ausführbare Datei extrahiert und ausgeführt.

Der Grund dafür ist, dass uudecode in seiner Eingabe nach bestimmten Markerzeilen sucht ( begin und end ), die dort von uuencode gesetzt werden, also nur das codierte Programm entschlüsseln, nicht das gesamtes Skript:

%Vor%

Es gibt noch andere Dinge, über die Sie sich Gedanken machen sollten, wie zum Beispiel die Möglichkeit, dass Ihr Programm Shared Libraries benötigt, die auf dem Zielsystem nicht existieren, aber der obige Prozess ist im Grunde genau das, was Sie brauchen.

Der Prozess für eine JAR-Datei ist sehr ähnlich, außer dass die Art, wie Sie sie ausführen, anders ist. Es ist immer noch eine einzelne Datei, aber Sie müssen die Zeile ersetzen:

%Vor%

mit etwas, das JAR-Dateien ausführen kann, z. B .:

%Vor%     
paxdiablo 08.05.2012, 02:25
quelle
2

Ich denke machen ist was du beschreibst.

    
dschulz 08.05.2012 02:31
quelle
2

Der tragbare Weg, dies zu tun, ist mit dem Befehl printf und oktalen Escapes:

%Vor%

um die Bytes 1, 2 und 3 zu drucken. Da Sie wahrscheinlich nicht alles von Hand schreiben möchten, kann der Befehl od -b verwendet werden, um einen Octal-Dump der Datei zu generieren. co_de% script, um den Müll zu entfernen und die richtigen Backslashes an Ort und Stelle zu setzen.

    
R.. 08.05.2012 02:45
quelle

Tags und Links