2017-02-11 5 views
3

je tente de me frayer un chemin à travers une capture-the-Flag Live VM, et se retrouver en essayant d'utiliser gdb pour modifier une valeur passée sur la pile (dernier élément à être poussé):GDB: Changement chaîne en mémoire sur la pile

system("date"); 

Pour

system("ash"); 

jusqu'à présent, mes efforts ont été gdb comme suit:

pile

L'adresse que je suis intéressé par le dernier élément de la pile (premier dans la liste de pile ci-dessous)

(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) 

tentative de changer la mémoire 1

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

Comme vous pouvez le voir , Je mangle le pointeur.

tentative de changer la mémoire 2

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

Plus mangling - quelque chose à voir avec déréférencement tort?

tentative de changer la mémoire 3

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

Essayer d'utiliser les valeurs ASCII au lieu - ne fonctionne pas comme prévu.

Toute aide appréciée - été gratter (chauve) la tête pendant un certain temps maintenant ...

Merci

sc.

Répondre

3

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

Ceci est faux: le type d'objet à l'adresse 0x080485ff est char[5], pas char*. Alors que les premiers peuvent être coulés dans le second, ils ne sont pas du tout les mêmes.

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

Ceci est faux pour la même raison: il n'y a pas de pointeur à l'adresse 0x080485ff.

set {int}0x080485ff = 68736100

Celui-ci n'a pas de sens, puisque 68736100 est 0x418d464 dans l'hexagone, et les déchets en ASCII. Vous probablement signifiait 0x68736100.

qui est en fait très proche:

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

Le problème est que 0x68736100 est "hsa\0" - vous avez troqué correctement les caractères, mais vous avez mis la terminaison NUL à l'avant au lieu de l'arrière. La bonne invocation est alors:

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

Cela a fonctionné!

+0

Merci beaucoup monsieur! C'était en effet ce que j'avais besoin de faire - et vos explications étaient très appréciées. En ce qui concerne l'hexagone, j'avais omis de supposer simplement qu'un rvalue pouvait commencer par 0x. Doh. Merci encore. – swisscheese