Montag, 28. Juli 2008

Spaß mit DLL-Injection

Heute will ich mich mal mit einer sehr interessanten Debug-Technik befassen: der DLL-Injektion.
Jeder der schon mal in C++ oder ähnlichem gecodet hat kennt sicherlich das Konzept des Überladen von Funktionen. Die Frage ist jetzt: Kann man das ganze auch noch machen wenn ein Programm schon fertig gebacken ist? Otto würde jetzt sagen "Yiiiaaaaaaaaaah ih ih ih ih" *rumhüpf*

Als Beispiel werde ich hier mal etwas fehlerhaften C-Code kompilieren und im Nachhinein die verantwortliche Funktion mit etwas harmlosen überladen.

Hier erst mal unser fehlerhafter code

#include <unistd.h>
#include <stdio.h>

int main()
{
char buffer[256];
vscanf("%s",buffer);
return 0;
}


Das Ganze segelt in einem herrlichen Segfault ab ^^. Ok, jetzt wollen wir einfach mal die Funktion vscanf mit etwas harmlosen "überschreiben". Dazu werden wir eine Dummy-lib schreiben und diese mit LD_PRELOAD dynamisch in unser Programm linken.

Der Code für unser Lib sieht erst mal so aus:


#include <unistd.h>
#include <stdio.h>

int vscanf(const char* format,va_list ap)
{
printf("override\n");
return 0;
}


Voila, wir haben die Zutaten. Jetzt wird es Zeit für das Rezept:


[raichoo@tessaiga ~]$ gcc test.c -o karpott
[raichoo@tessaiga ~]$ ./karpott
test
Segmentation fault: 11 (core dumped)
[raichoo@tessaiga ~]$ gcc -shared -o override.so override.c
[raichoo@tessaiga ~]$ LD_PRELOAD=./override.so ./karpott
override


Guten Appetit!

Keine Kommentare: