Kurs:Wie funktioniert eigentlich ein Computer/Tage/Tag2

Aus Wikiversity
Zur Navigation springen Zur Suche springen

Zurück zur Übersicht

Tag 2 - Samstag, 29.06.2013[Bearbeiten]

Aufgabe 3: Änderung eines bestimmten Prozessorbefehls in einem kompilierten Programm[Bearbeiten]

Aufgabenstellung[Bearbeiten]

Es sind zwei Programme gegeben:Ein Programm addiert zwei Zahlen, das andere subtrahiert diese voneinander. Aus Aufgabe 2 ist bekannt, an welchen Stellen sich die kompilierten Programme unterscheiden. Aufgabe ist es eines der Programm so zu verändern, dass es sich so wie das andere verhält.

add.c

 #include<stdio.h>

int main(int argc, char** argv)
{
 if (argc != 3)
 {
  printf("please pass two integer to the program!");
  return -1;
 }
 int a;
 sscanf(argv[1],"%d",&a);
  
 int b;
 sscanf(argv[2],"%d",&b);
  
 int c;
 c = a + b;   //Unterschied!!
 printf("%d\n",c);
 return 0;
}


sub.c

 #include<stdio.h>

 int main(int argc, char** argv)
 {
 if (argc != 3)
 {
  printf("please pass two integer to the program!");
  return -1;
 }
 int a;
 sscanf(argv[1],"%d",&a);
  
 int b;
 sscanf(argv[2],"%d",&b);
  
 int c;
 c = a - b;  //Unterschied!!
 printf("%d\n",c);
 return 0;
}

Lösung[Bearbeiten]

Wie in Aufgabe 2 vergleichen wir die Objectdumps der beiden kompilierten Programme.

Objdump von einem Addier-Programm verglichen mit dem eines Subtrahier-Programms

Wir benutzen einen weiteren Konsolenbefehl:"xxd". Dieser Befehl zeigt das kompilierte Programm ebenfalls in hexadezimaler Schreibweise an, setzt allerdings keine Kommentare dazu. Auch hier werden beide Ausgaben mit "diff" verglichen.

Objdump von einem Addier-Programm verglichen mit dem eines Subtrahier-Programms

Der xxd-Vergleich liefert drei Stellen, die unterschiedlich sind. Werden diese Stellen in dem einen Programm durch die entsprechenden Hex-Zahlen des anderen ersetzt, so haben beide Programme beim Ausführen denselben Effekt.

Nun ist die Frage, ob wirklich alle 3 Stellen geändert werden müssen, damit beide Programme die Zahlen addieren bzw. subtrahieren. Aus dem Objectdump-Vergleich lässt sich schließen, dass der Unterschied zwischen dem Addieren und dem Subtrahieren in nur drei Hex-Zahlen besteht. Man muss hier allerdings beachten, dass der Objectdump die Zahlen nicht immer in der richtigen Reihenfolge anzeigt. Wir merken uns also nur, dass wir nach drei geänderten Hex-zahlen suchen und schauen uns nun den xxd-Vergleich an. Im mittleren Unterschied kommen genau diese Veränderungen vor. Wenn man nun in einer der Programme genau diese drei Zahlen durch die des anderen Programms ersetzt, so erreichen wir dasselbe Ergebnis: Im Screenshot sieht man das Ergebnis des ursprüngliche Programms vorher (7) und nacher(13).

Das Subtrahier-Programm erst mit richtiger und dann mit Addier-Funktion

Wenn man die Veränderungen ins binäre System übersetzt, so lässt sich erkennen, dass gerade mal 5 Bits geändert werden müssen um die Funktion des Programmes so zu beeinflussen. Die 5Bit, die geändert werden müssen um aus eine Addition eine Subtraktion zu machen.