Kurs:Wie funktioniert eigentlich ein Computer/Tage/Tag2

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;
}

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

 

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.

 

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).

 

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.