ENUNCIADO: Manipulando el Stack
TIPO: Buffer Overflow
DIFICULTAD: ALTA
TIEMPO: 45 MINUTOS
DESCRIPCIÓN
Juan es un programador fanático de juegos que creó uno para sus amigos donde compiten contra una "inteligencia artificial" que siempre gana. Sin embargo, su amigo Carlos logró vencer al sistema.
OBJETIVO:
Hacer que el programa ejecute la sentencia donde se imprime el código ganador, explotando una vulnerabilidad en el código.
MECÁNICA DEL JUEGO
El juego consiste en una canasta vacía donde cada jugador puede agregar 1 o 2 bolitas por turno. Gana quien logre que la canasta tenga exactamente 15 bolitas al final de su turno.
Jugador 1: Agrega 2 bolitas => canasta tiene 2 bolitas
Jugador 2: Agrega 1 bolita => canasta tiene 3 bolitas
Jugador 1: Agrega 2 bolitas => canasta tiene 5 bolitas
Jugador 2: Agrega 2 bolitas => canasta tiene 7 bolitas
Jugador 1: Agrega 2 bolitas => canasta tiene 9 bolitas
Jugador 2: Agrega 2 bolitas => canasta tiene 11 bolitas
Jugador 1: Agrega 1 bolita => canasta tiene 12 bolitas
Jugador 2: Agrega 2 bolitas => canasta tiene 14 bolitas
Jugador 1: Agrega 1 bolita => canasta tiene 15 bolitas
¡Jugador 1 gana!
CÓDIGO VULNERABLE
#include <stdio.h> #include <stdlib.h> void main(void){ printf("Ingrese su nombre:\n"); int turno = 2; int suma = 0; char nombre[80]; scanf("%s", nombre); int n = 0; while(suma < 15){ printf("\nElige un número:\n"); scanf("%d", &n); while(n <= 0 || n >= 3){ printf("Reintente, 1 ó 2:\n"); scanf("%d", &n); } suma += n; printf("La suma es: %d\n", suma); turno = 1; if(suma == 15){ break; } n = 3 - n; printf("\nLa computadora eligió: %d\n", n); suma += n; printf("La suma es: %d\n", suma); turno = 2; } if(turno == 2){ printf ("PERDISTE\n"); }else{ printf ("GANASTE: XXXXXX\n"); // En esta instrucción se muestra el código ganador. } }
COMPILACIÓN:
El programa fue compilado con: gcc desafio8.c -fno-stack-protector