Thursday, February 26, 2009

Détection de moufleurs.

Toi aussi, tu en as marre d'embaucher des moufleurs professionnels ? Voici la solution... des questions C bourrées de gros toupper("poils"[4]).

À la fin du questionnaire, on a un programme phouny:


void foo(void);
int main (void)
{
int i=2;
foo();
printf ("%d\n",i);
return EXIT_SUCCESS;
}

void foo(void)
{
// add code so that printf above prints different value of i (i.e. not 2)
}


Le but du jeu c'est d'afficher autre chose que 2 rien qu'en ajoutant du codaze dans foo(). Leur réponse est simple:

No, there is no portable, standard compliant way to modify main's "i" from foo

Bon... leur réponse est correcte, si vous devez faire ça dans un vrai projet alors changez de langage de codaze... Mais pour le fun, si jamais vous tombez sur une queston du genre en entretien, vous pouvez dire que c'est possible en parsant la stack depuis foo pour remonter jusqu'a i ou en __asm__ en récupérant l'ebp sauvé sur la pile et en faisant en movl sur (ebp) avec l'offset qui va bien pour tapper dans i. Ces deux solutions sont super dépendantes de l'archi (x86 ici).

La première solution donne:

void foo(void);

int main (void)
{
int i=2;
foo();
printf ("%d\n",i);
return EXIT_SUCCESS;
}
void foo(void)
{
int *t = &t + 11;

*t = 1337;
}


[clem1@toop tmp]$ gcc -o coin coin.c && ./coin
1337


D'autres solutions les barbus ?

PS: En une semaine je viens de remplir mon quota de billets pour les deux années à venir. :-)

Friday, February 20, 2009

Ça fuzz toujours...

Barbusses, barbus, bonsoir.

Y'a quelques jours, un monsieur d'une grosse boite qui assemble des transistors, m'a contacté me demandant où se trouvait le rapport ainsi que le code pondu lors de mon Summer Of Code 2006 sur la sayku des piles IPv6 des OS... Surpris, je lui ai gentillement répondu que j'allais lui fournir le ouaraize quand j'aurais accès à ma vieille babasse piquante sur laquelle se trouve mon ancienne webpage...

Curieux, je me suis remis à modifier un peu mes fuzzers de l'époque qui m'avait permis de détecter quelques bugs exploitables sous minusk (hein spacemonkey? [0]) et sous *BSD. Après quelques minutes de fuzzage, je suis tombé sur un petit bug intéressant qui permet de dumper 4 bytes de la stack noyau avec un simple getsockopt. Le descriptif se situe ici. En bref, lorsque l'on fait un getsockopt avec un SO_BSDCOMPAT en option, le kernel descend en espace utilisateur une variable locale (un entier) non initialisée.

C'est une faille de merde mais ça montre que des fuzzers vieux de 3 années peuvent être re-utilisés pour trouver de nouvelles failles dans un code qui évolue tous les jours (noyau minusk). Je suis sûr qu'il doit en y avoir pleins d'autres du même genre avec des ioctls par exemple. ;-)

En fait, je ne savais pas mais mes joujous semblent bien servir.

Voilà, posté après le boulot [1], bon week-end, #@!

[0] Si, par malheur, tu lis ses lignes, bein j'espère que tu vas bien.
[1] Parce que y'en a qui surveille... ;-)

Thursday, February 12, 2009

Bonjour, je code avec des moufles.

Hello les moulasses,

Aujourd'hui on va causer des moufleurs... des gens qui codent avec des moufles.

Squid.

Chez squid, ils ont des moufleurs professionnels qui laissent des asserts dans le code qui sont basés sur des variables qui sont indirectement controlables par l'utilisateur (entête HTTP de réponse du serveur HTTP).

Tout se passe dans la récupération des numéros de version du protocole HTTP dans la réponse du serveur (HTTP/1.0 200 OK)... Voici le snippet pour la récupération de la version majeure:

162 int i = 0;
163 int retcode;
164 int maj = -1, min = -1;
(...)
257 /* next should be 1 or more digits */
258 maj = 0;
259 for (; i < hmsg->req_end && (xisdigit(hmsg->buf[i])); i++) {
260 maj = maj * 10;
261 maj = maj + (hmsg->buf[i]) - '0';
262 }
(...)
296 assert(maj != -1);


Comme maj est déclaré en signed int, nous pouvons mettre une grosse valeur dans la version HTTP pour, qu'après la boucle, maj soit égale à -1 et que ça assert en beauté. Taddam.

C'est la même chose pour la récupération du la version mineure. C'est la classe les asserts en prod. \o/

Wireshark.

*privatejoke* "Vous connaissez wireshark ? C'est un outil très puissant." *privatejoke*

Chez wireshark, ils ont aussi de belles petites moufles.

Banzaï !