Une messagerie pas si sure que ca

Chiche a cette fois-ci programme un systeme de messagerie. A l'aide de cet outil n'importe quel utilisateur peut lui laisser un message. Ce programme va ajouter au fichier messages le nom de l'auteur et le message qui lui sont passes en parametres.

Le programme est : msg

Exercice:

faire un chmod +s avec un autre user sur ce programme et essayer d'obtenir un shell

Demarche a suivre:

Dans un premier temps il faut chercher l'erreur dans le code source ci-dessous. Puis ecrivez un programme (en c ou en python) qui realise les conditions pour faire planter le programme.

Creer ou utiliser un shellcode du cours. D'autre part, il faut faire attention aux privileges de /bin/sh ( cf cours ).

Enfin il faut ecrire un exploit permettant d'executer son shellcode.

/src/msg.c


#include    <sys/stat.h>
#include    <unistd.h>
#include    <fcntl.h>
#include    <stdio.h>

#define     not_dangerous(x)      (((unsigned char)x != 0x81) && ((unsigned char)x != 0x80))

void       write_message(int fd, char author[], char msg[])
{
        char buffer[512];
        int i;

        for (i = 0; (i < 511) && (msg[i]); i++)
        {
                buffer[i] = msg[i];
                if (msg[i + 1] == '\"')
                        msg[++i] == '\0';
        }
        buffer[i] = '\0';
        dprintf(fd, "%s : %s\n", author, msg);
}

int        init_message(char *author, char *msg)
{
        int fd;

        if (strlen(author) > 32 || strlen(msg) > 512)
        {
                fprintf(stderr, "Error: arguments trop grands\n");
                return (-1);
        }
        if ( ( fd = open("messages", O_CREAT | O_APPEND | O_WRONLY, 00600) ) == -1 )
        {
                perror("messages");
                return (-1);
        }
        write_message(fd, author, msg);
        close(fd);
        printf("message deliver\n");
        return (0);
}

void       clean_input(char **argv, char **envp)
{
        for (; *argv; argv++)
                sanitaze(*argv);
        for (; *envp; envp++)
                sanitaze(*envp);
}

int        main(int argc, char *argv[], char *envp[])
{
        if (argc != 3)
        {
                fprintf(stderr, "usage %s author message\n", argv[0]);
                return (-1);
        }

       return (init_message(argv[1], argv[2]));
}