Archives du blog

dimanche 28 octobre 2012

IO level2

Je préviens, cet article est un spoiler au level2 de IO







Donc, arrivé au niveau2 la suite logique des évènements est de tester le binaire, mais cette fois-ci on nous livre les sources avec !






Notre programme nous conseille juste de lire son code qui se trouve dans le même dossier "level02.c"
Le voici :























Ça parait un peu plus évident maintenant. On remarque la fonction catcher qui lance notre message de congratulation habituel suivit d'un shell level3 seulement la fonction n'est lancée qu'au moment où le signal SIGFPE est levé. Ce dernier apparaît lorsqu'on amène l'ordinateur a faire une division par zéro ou qu'on dépasse un entier maximal (vous vous souvenez sur vos calculettes lorsque que vous faisiez 10 puissance 9999999999999 ?)
Et comme ici il se trouve que justement on a une division alors on pourrait se débrouiller pour faire planter le programme et ainsi, lever le signal SIGFPE.

Le calcul retourne la valeur absolue du premier paramètre divisé par le deuxième on pourrait croire qu'on peut faire notre division par 0 mais la présence d'un contrôle sur l'argv[2] nous en empêche.

La solution ici est donc de réaliser un integer overflow, c'est à dire un dépassement d'entier.
Tout d'abords il nous faut trouver la valeur maximale et minimale qu'un entier peut prendre :









Et là c'est plutôt une bonne nouvelle, il se trouve qu'on peut effectivement faire un integer overflow =)
si jamais je divise -2147483648 (qui est bien un entier minimal) par -1 il deviendra plus grand que l'entier maximal et alors, le système pourra lever le signal SGFPE qui lancera le shell !










Moralité, ben...Juste faire gaffe avec les divisions..



Aucun commentaire:

Enregistrer un commentaire