raisep0wn

Geek Stuff & IT Security

Posts Tagged ‘Off By One

NDH 2k10 Public WarGame level6

leave a comment »


Code source de l’épreuve :

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

// gcc -o level6 level6.c -fno-stack-protector -z execstack -mpreferred-stack-boundary=2

int layer(char *arg){
if(strlen(arg)>128) {
printf("Aww noes you'r crazy !\n");
exit(0);
}
char buf[128];
strcpy(buf, arg);
return 0;
}

int main(int argc, char *argv[])
{
if(!argv[1]) return;

layer(argv[1]);
return 0;
}

Voilà quelque chose d’intéressant pour tout programmeur débutant en C. Ici nous avons un buffer de 128 octet, et nous empêchons une chaine de plus de 128 caractères d’être copiée dans ce buffer. Où est le problème ? Hé bien la fonction strlen() compte les caractères de la chaine en omettant le caractère null qui la termine. « foo » fait bien 3 caractères, mais en mémoire elle prend 4 octets [foo+null]. Lorsque strcpy() copiera une chaine de 128 caractères, elle écrasera l’octet suivant en ajoutant le caractère null. C’est ce que l’on appel un off by one. Ainsi, le dernier octet de SEBP est écrasé provoquant (ou pas) un décalage d’au plus 255 sur EBP. En bidouillant un peu, ou en ayant de la chance, après deux leave / ret, EIP pointe en plein dans notre buffer. Il ne reste plus qu’a le rediriger vers notre shellcode. La vidéo explique relativement en détail le comment du pourquoi.

Références :

Publicités

Written by Ralph

28/05/2011 at 08:04

Publié dans IT Security

Tagged with , , ,