PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ExploitMe Contest / Level 05



Chrisimo
29.10.2006, 12:04
Hallo,

ich habe mich mal mit den ExploitMe's aus dem Contest beschäftigt und bin jetzt bei Level 05. Da habe ich einige Verständnisschwierigkeiten.
Da heißt es, man soll die GOT Adresse von exit mit der Adresse des shellcodes überschreiben. Das GOT die Global Offset Table ist, habe ich schon herausgefunden. Was das aber genau bedeutet, nicht.

wenn ich nun das ExploitMe disassembliere, steht bei
0x08048422 <main+86>: call 0x804830c <exit@plt>
weiter steht bei 0x0804830c <exit@plt>
0x0804830c <exit@plt+0>: jmp *0x8049610

Die Adresse von 0x08049610 ist die gleiche, die ich mit objdump -R für exit rausfinde, also die, die ich dann wohl überschreiben muss. Jetzt weiß ich allerdings nicht, wie ich diese überschreiben soll.
Das Programm sowie der Abschnitt <exit@plt> liegen doch im .text bereich des speichers, oder? Damit also nicht überschreibbar. Wie kann ich denn dann die Adresse überschreiben?


Gruß,

Chrisimo

maloi
29.10.2006, 21:57
Sers,

ob .text writable ist hängt wohl vom System bzw. von Dir ab.
Und überschreiben kannst du den GOT-entry von exit() mit Hilfe von printf(buffer);
Wahrscheinlich hilft dir folgender Text weiter:
http://community.corest.com/~juliano/teso-fs1-1.pdf

Viel Erfolg.

Chrisimo
30.10.2006, 06:25
Hi!

Danke, aber das mit printf wusste ich auch schon (kam ja auch in einem der anderen ExploitMe's vor). Ich hatte auch den Text, den Du verlinkt hast, schon gelesen.
Mir ist nur nicht ganz klar, wo sich die GOT befindet, bzw. die Adresse, die ich überschreiben soll. Mit Format-Strings kann ich Werte vom Stack holen und dann auch draufschreiben. Das würde bedeuten, der GOT-Entry von exit müsste auf dem Stack liegen, damit das mit dem Format-String funktioniert, oder?


Gruß,

Chrisimo

maloi
30.10.2006, 11:49
Hallo,

dann hast du diesen wohl nicht richtig verstanden/gelesen. Mit einem user supplied formatstring kannst du an jede beliebige Adresse im Speicher schreiben. Man legt die Adresse die man überschreiben will in den Formatstring.
Du legst jetzt also innerhalb deines Formatstrings die GOT-Adresse von exit(), "suchst" sie mit Hilfe von %x oder wie auch immer, und überschreibst den Wert (Adresse), der an dieser Adresse steht (mit Hilfe vom %n Format) mit der Adresse deines Shellcodes oder was auch immer.

Auf man 3 printf


The number of characters written so far is stored into the integer indicated by the int * (or variant) pointer argument.

Fazit: Die Adresse, die du überschreiben willst kann überall liegen, weil du sie nicht direkt überschreibst.

Hoffe das hilft.

Chrisimo
02.11.2006, 09:54
Hi!


Ja, ich hatte nicht bedacht, dass mein Format-String ja auch auf dem Stack landet und ich irgendwann dort anlange, d.h. ich die Adressen, an denen ich etwas ändern möchte, im Format-String angeben kann.

Ich habe deswegen mal ein paar Experimente gemacht und bin dabei auf eine weitere Frage gestoßen. Ich muss im Format-String die Speicheradresse übergeben, die ich ändern will (wenn ich z.B. "AAAA" an den Anfang des Format-Strings setze, würde ich den Wert an Adresse 0x41414141 ändern).
Ich könnte nun folgenden Format-String eingeben:

AAAAAAABAAACAAAD%n%n%n%n

Dieser würde folgendes machen:

1. 4 an Adresse 0x41414141 schreiben
(Speicher würde so aussehen: 0x41414141: 04 00 00 00 FF FF FF FF)
2. 8 an Adresse 0x41414142 schreiben
(Speicher würde so aussehen: 0x41414141: 04 08 00 00 00 FF FF FF)
3. 12 an Adresse 0x41414143 schreiben
(Speicher würde so aussehen: 0x41414141: 04 08 12 00 00 00 FF FF)
4. 16 an Adresse 0x41414144 schreiben
(Speicher würde so aussehen: 0x41414141: 04 08 12 16 00 00 00 FF)

Ist das soweit richtig?

Das heißt also, wenn ich den Speicher hinter 0x41414141+4 nicht brauche, ist das soweit in Ordnung....

Da ich das ganze nun unter Windows mache, bin ich auf folgendes Problem gestoßen:
Egal, ob ich malloc verwende oder den Speicherbereich fest eingrenze, ich hab immer eine Adresse von 0x00xxxxxx für mein char-array. Wie kann ich denn nun per Format-String an dieser Stelle etwas ändern? bei \x00 hört der String ja auf...

maloi
02.11.2006, 13:05
Hey,

unter Windows müsstest du den Formatstring anders gestalten. Etwa in der Form:

[SHELLCODE][[AAAAAAA...][%x%x%x%x%x...][%.613278x%.612455x%n][\x13\xef\x11]

Wobei die Adresse am Ende des Strings halt die Adresse vom SIP oder irgendwas anderes ist. Hier 0x0011ef13.
Bei x86 hast du little endian also lsb an niedrigster speicheradresse also zuerst im string. Die 0x00 wird vom Ende des Strings übernommen. Du musst halt mit nem single-write die Adresse überschreiben.

Bei manchen Windows-Versionen geht es wohl nur bis %.516x...keine Ahnung wie es da geht.

PS: Ich hab keine Ahnung von Windows und Formatstrings.

Das sollte nur n möglicher Ansatz sein, also selber überlegen macht schlau. ;)