2017-02-11 1 views
3

Ich versuche, mich durch eine Capture-the-Flag-Live-VM zu kämpfen und beim Versuch, gdb zu verwenden, um einen auf dem Stack übergebenen Wert zu ändern (Grafik) gedrückt):GDB: Zeichenkette im Speicher des Stacks ändern

system("date"); 

Um

system("ash"); 

Bisher haben meine gdb Bemühungen wie folgt:

Stapel

Die Adresse ich interessiert bin, ist das letzte Element auf dem Stapel (first in dem Stapel Liste unten)

(gdb) p $esp 
$1 = (void *) 0xbf902690 

(gdb) x/32w 0xbf902690 
0xbf902690: 0x080485ff 0x0000044c 0xb7783ff4 0xbf9026b8 
0xbf9026a0: 0xb76a8fa9 0xb7797356 0x08048529 0x0000044c 
0xbf9026b0: 0x08048520 0x08048410 0xbf902728 0xb7695cf7 
0xbf9026c0: 0x00000001 0xbf902754 0xbf90275c 0xbf9026e4 
.... 
(gdb) x/s 0x080485ff 
0x80485ff: "date" 
(gdb) x/s *0x080485ff 
0x65746164: <Address 0x65746164 out of bounds> 
(gdb) 

Versuch, Speicher 1

zu ändern
(gdb) set {const char [4] *}0x080485ff = "ash " 
(gdb) x/s 0x080485ff 
0x80485ff: "\b`\354\b" 
(gdb) 

Wie Sie sehen können , Ich mangle den Zeiger.

Versuch Speicher 2

(gdb) set *((const char *)0x080485ff) = "ash " 
(gdb) x/s 0x080485ff 
0x80485ff: "\bate" 
(gdb) 

Mehr Mangeln zu ändern - etwas mit Unrecht zu tun dereferencing?

Versuch zu ändern 3-Speicher

(gdb) set {int}0x080485ff = 68736100 
(gdb) x/s 0x080485ff 
0x80485ff: "d\324\030\004" 
(gdb) 

Der Versuch, stattdessen die ASCII-Werte zu verwenden - nicht funktioniert wie geplant.

Jede Hilfe willkommen - jetzt ...

Dank

sc wurde mein (Glatze) Kopf für eine Weile zu kratzen.

Antwort

3

set *((const char *)0x080485ff) = "ash "

Das ist falsch: der Typ des Objekts an der Adresse 0x080485ff ist char[5], kein char*. Während ersteres zu letzterem gewirkt werden kann, sind sie nicht alle gleich.

set {const char [4] *}0x080485ff = "ash "

Dies aus dem gleichen Grund ist falsch: Es gibt keine Zeiger an der Adresse 0x080485ff.

set {int}0x080485ff = 68736100

Dies macht keinen Sinn, da 68736100 ist 0x418d464 in hex und Müll in ASCII. Sie wahrscheinlich gemeint 0x68736100.

, die tatsächlich ganz in der Nähe ist:

(gdb) x/s 0x080485ff 
    0x80485ff: "" 
    (gdb) x/s 0x080485ff+1 
    0x08048600: "ash" 

Das Problem ist, dass 0x68736100 ist "hsa\0" - Sie richtig die Zeichen getauscht haben, aber Sie haben das abschließende NUL an der Front statt der Rückseite setzen. Der richtige Aufruf lautet dann:

(gdb) set {int}0x080485ff = 0x687361 
(gdb) c 
Continuing. 
sh: ash: command not found 

Es hat funktioniert!

+0

Vielen Dank, mein Herr! Das war in der Tat, was ich tun musste - und Ihre Erklärungen wurden sehr geschätzt. In Bezug auf das Hex konnte ich nicht einfach annehmen, dass ein rvalue mit 0x beginnen könnte. Do. Danke noch einmal. – swisscheese

Verwandte Themen