Hallo,
Ich habe ein kleines Problem.
Im Sinne eines Projekts muss ich einen Shellcode in C Ausgeben, jetzt
muss die Bytefolge 0x00 0xf1 0x34 ausgegeben werden.
Verwendet werden muss printf, das Problem ist, 0x00 bzw \0 ist der
Terminator eines char strings, wird also als "Ende erkannt" und es wird
nicht weiter ausgegeben? Wie kann ich das umgehen? Ich habe google schon
gefragt aber offenbar nicht die richtigen Suchbegriffe eingegeben.
Gruß,
Matthias
xvzf schrieb:> Herzlichen Dank!
Wofür?
Du zwingst damit nur printf einen leeren String anzulegen, aber
ausgegeben wird der trotzdem nicht.
printf ruft putchar auf und bricht bei der 0 ab. Da die 0 zuerst im
Puffer steht, wird nichts ausgegeben.
Man kann nunmal aus einem Sieb keinen Kaffee trinken.
Peter D. schrieb:> Du zwingst damit nur printf einen leeren String anzulegen, aber> ausgegeben wird der trotzdem nicht.
Das waere bei %s der Fall, %c gibt trotzdem ein Zeichen aus. Wenn du mir
nicht glaubst, probier es halt selber aus, leite die Ausgabe in eine
Datei und guck sie dir im Hexeditor an...
Peter D. schrieb:> printf ruft putchar auf und bricht bei der 0 ab. Da die 0 zuerst im> Puffer steht, wird nichts ausgegeben.
Wieso sollte die Null nicht ausgegeben werden? Nur bei ASCIIZ (%s) ist
es das Endezeichen. Bei %c wird das Zeichen ausgegeben.
eric schrieb:> Das waere bei %s der Fall, %c gibt trotzdem ein Zeichen aus.
Dann habe ich das wohl mit sprintf verwechselt, das kann kein 0-Byte
ausgeben.
Trotzdem würde ich printf nie für Binärdaten verwenden, das ist einfach
das falsche Werkzeug dafür.
Peter D. schrieb:> Trotzdem würde ich printf nie für Binärdaten verwenden, das ist einfach> das falsche Werkzeug dafür.
Warum?
Zu Zwecken des Debuggings kann man mit printf wunderbar Binärdaten als
Hex-Werte auf der Konsole ausgeben (oder Dezimalwerte, oder Oktalwerte,
oder Gleitkommazahlen, ...). Klappt einwandfrei.
Peter D. schrieb:> eric schrieb:>> Das waere bei %s der Fall, %c gibt trotzdem ein Zeichen aus.>> Dann habe ich das wohl mit sprintf verwechselt, das kann kein 0-Byte> ausgeben.
Auch sprintf gibt – genauso wie fprintf und printf – das NUL-Zeichen und
alle ggf. danach kommenden Zeichen aus. Das kannst du bspw. mit Hilfe
eines Debuggers oder fwrite feststellen.
Wenn du dir das Ergebnis allerdings mit puts oder einer anderen
stringbasierten I/O-Funktion anschauen möchtest, wird die Ausgabe beim
ersten NUL-Zeichen abgebrochen. Das ist aber eine Eigenschaft dieser
Stringfunktionen, nicht von sprintf.
Beispiel:
sprintftest.c:
Mark B. schrieb:> Zu Zwecken des Debuggings kann man mit printf wunderbar Binärdaten als> Hex-Werte auf der Konsole ausgeben
Peter meinte die direkte Ausgabe der Binärdaten. Wenn diese per %x in
die Hex-Darstellung konvertiert werden, sind die ausgegebenen Zeichen ja
wieder ganz gewöhnliche, druckbare Zeichen.
Ob [fs]printf auch für die Ausgabe von nichtdruckbaren Zeichen genutzt
wird, ist IMHO eine Frage der konkreten Anwendungsfalls und des
persönlichen Geschmacks.
Das ganze war eine Ausgabe für Shellcode, ich erwarte kein Zeichen! Nur
eine Bytefolge um schnell etwas zu testen!
Und es funktioniert. Ist eine quickndirty Lösung und wird später richtig
implementiert. Aber bis dahin muss printf reichen!