Kurs:Wie funktioniert eigentlich ein Computer/Themen/Aufgabe1 Unterschiedliche Ausgabe bei gleicher Dateigröße
Aufgabe 1 - Thema : Unterschiedliche Ausgabe bei gleicher Dateigröße
[Bearbeiten]Aufgabenstellung
[Bearbeiten]Erstellen von zwei Programmen, die identisch sind bis auf die Ausgabe. Bei einem Programm wird noch ein Ausrufezeichen zusätzlich ausgegeben:
hello.c
#include<stdio.h>
int main()
{
printf("Hallo Welt");
}
hello2.c
#include<stdio.h>
int main()
{
printf("Hallo Welt!");
}
Wenn man die Größe der kompilierten Dateien vergleicht, sieht man dass sie beide 5137 Bytes groß sind, obwohl sie eine andere Ausgabe haben:
Dies liegt daran, dass der Befehl
printf()
beim Aufruf einen bestimmten Speicherbereich reserviert. Fügen wir nun das Ausrufezeichen zum auszugebenden Text hinzu, wird dieser in den zuvor leeren, aber reservierten Bereich geschrieben.
Ist es dann möglich die Ausgabe des Programm zu verändern nachdem es kompiliert wurde?
Lösung
[Bearbeiten]Zuerst öffnen wir die beiden kompilierten Dateien mit Emacs im Hexl-Mode.
Hinweis: Um in Emacs in die Hexadezimal-Anzeige zu kommen, muss man M-X drücken und dann "hexl-mode" eingeben. Im Hexl-Mode wird in der ersten Spalte die Zeilennummerierung in Hexadezimal-Schreibweise angezeigt. In den mittleren 8 Spalten sind ist Inhalt des Programms in Hexadezimal-Schreibweise und in der rechten Spalte als ASCII-Code interpretiert.
In dem Programm, das das Ausrufezeichen ausgibt suchen wir nach einer 2116. In der ASCII-Tabelle entspricht das einem Ausrufezeichen. Es gibt nur wenige Ergebnisse und wir nehmen die Stelle wo in der rechten Spalte "Hallo Welt!" steht. Parallel (im der anderen Datei) wird die selbe Stelle anhand der Zeilennummer gesucht.
Man kann erkennen, dass anstelle der 2116 hier eine 0016 steht. Diese Stelle ist also der Grund für die unterschiedliche Ausgabe. Wir können also an diese Stelle ein beliebiges Zeichen der ASCII-Tabelle in hexadezimaler Schreibweise setzen, wodurch sich die Ausgabe dementsprechend verändert.