Nachdem ich in den vergangen Tagen einige Artikel über DLL hijaking unter Windows gelesen habe, sind mir ein paar alte Kniffe aus meiner Zeit in der Testadministration wieder eingefallen.

Wer schon mal in C/C++ Programme geschrieben hat, der hat im allgemeinen auch schon mal von Libraries gehört. Libraries sind Bündel von ausführbarem Code, die man nutzen kann um sich das Leben zu erleichtern. So gibt es zum Beispiel eine Library die sich mit der Strings behandelt werden.

Damit aber nun nicht jedes Programme alle Libraries beinhalten muss, gibt es einen Mechanismus der die benötigten Libraries zur Laufzeit nach lädt. Der Ort an dem die Libraries gesucht werden steht hierbei in der Environment Variable “LD_LIBRARY_PATH”. Um Sicherheitsprobleme zu vermeiden empfiehlt es sich das lokale Directory “.” NICHT mit in die Liste auf zu nehmen. Neben LD_LIBRARY_PATH gibt es noch eine weitere Variable mit der man das Laden von Libraries beeinflussen kann: LD_PRELOAD.

LD_PRELOAD gibt an welche Libraries zu aller erst geladen werden sollen. Beim Laden von Libraries gilt wer zu erst kommt der malt zu erst. Ein kleines Beispiel soll das ganze verdeutlichen:

test.c:
#include <stdio.h>
#include <string.h>

int main( int argc, char **argv)
{

 int test;
 char *myst = "Mein kleiner Test";
 printf("%s\n",myst);
 printf("%d\n",strlen(myst));
 return 0;

}

Dieses kleine Programm gibt einen kleinen Text aus und die Länge:

~/test $ ./test
Mein kleiner Test
17

Als nächstes schreiben wir uns eine kleine Library, welche die strlen Funktion beinhaltet:

#include <stddef.h>

size_t strlen(const char *s)
{
 return 42;
}

nun erstellen wir hieraus eine Library:

gcc -shared -Wl,-soname,your_soname -o mystrlen.so mystrlen.c

und laden diese vor der Ausführung:

nidsche@cserver ~/test $ LD_PRELOAD=./mystrlen.so ./test
Mein kleiner Test
42

Wir haben nun erfolgreich die strlen Funktion durch eigenen Code ersetzt. Ist das “s” Bit für ein executable gesetzt, verhindert der dynamische Lader die Auswertung der LD_PRELOAD variable.