Aujourd'hui on s'attaque au challenge "bof" de pwnable.kr.

Récupérons le code source.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
	char overflowme[32];
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){
		system("/bin/sh");
	}
	else{
		printf("Nah..\n");
	}
}
int main(int argc, char* argv[]){
	func(0xdeadbeef);
	return 0;
}

Un simple Buffer overflow. On va résoudre ca vite.

En faisant une rapide vérification, on s’aperçoit que l’exécutable est protégé par un "canary".

Si on décompile le code avec radare2 on voit que la vérification du canary est effectuée après l'appel système qui lance le shell. Ce qui veut dire que l'on a pas besoin de se préoccuper de cette sécurité.

Tout ce qui compte finalement dans ce code c'est de remplir le tableau de 32 octets (théoriques) et de réécrire l'argument arg_8h avec la valeur 0xcafebabe.

Une méthode simple pour y parvenir serait d'overflower (non ce verbe n'existe pas) le buffer avec uniquement la valeur 0xcagebabe répétée plusieurs fois.

Simple et efficace mais ça manque de classe

Comme c'est aveu flagrant de manque de maîtrise , on va faire un buffer overflow correctement.

Première étape: Avoir la taille exacte du buffer. Il y a plusieurs façon de procéder mais comme je ne peux pas exécuter le binaire du serveur dans mon environnement on va se contenter de la déduire par une méthode simple: le guess and try.

Deuxième étape: Pwned le programme !
Donc après quelques tentatives on arrive à la conclusion que le buffer fait 13 octets. Donc on injecte 14 octets et on réécrit la valeur cible.

Et voilà le résultat:

Social et Media

Comme toujours je suis disponible sur Twitter et cie, si vous avez des questions, des remarques, des suggestions etc. N’hésitez pas !

Twitter: @GhostAgs

Discord: hackraw