EquationSolver - IW CTF Writeup
En este artículo se presenta una solución al reto EquationSolver (exp60) del InternetWache CTF 2016. Agradecemos a los organizadores por las muchas horas de diversión y aprendizaje que nos han regalado.
Descripción
El reto nos presenta la siguiente descripción:
I created a program for an unsolveable equation system. My friend somehow forced it to solve the equations. Can you tell me how he did it?
Además de una dirección IP y puerto donde luego de conectar con Netcat, vemos lo siguiente:
Solve the following equations: X > 1337 X * 7 + 4 = 1337 Enter the solution X:
Análisis
El sistema de ecuaciones al que se refiere la descripción es: X > 1337 y X * 7 + 4 = 1337. Aparentemente es un
sistema de ecuaciones que no tiene solución. Si X es mayor que 1337 ¿Cómo podría X * 7 + 4 ser igual a 1337?
Luego de un brainstorming en el chat de Amn3s1a, se sugirió provocar un integer overflow. Un integer overflow
sucede cuando la representación binaria de un número no cabe en los 4 bytes de una variable tipo int. En tal caso los
bits en exceso se truncan y son ignorados.
Veamos un ejemplo. En el siguiente código int x = 0xFFFFFFFF, y = x + 1; el valor de y quedaría en 0 puesto que
0xFFFFFFFF + 1 es 0x0100000000 y luego de truncarlo a 4 bytes queda 0x00000000 lo cual es ciertamente 0.
La idea es usar este comportamiento para resolver el sistema de ecuaciones.
Solución
Entonces debemos buscar un número X tal que X * 7 + 4 genere un integer overflow que resulte en 1337.
Expresandolo en forma de ecuación:
X * 7 + 4 = 1337 X * 7 = 1333
Operamos un poco para representar la ecuación X * 7 = 1333 de forma más conveniente:
X * 7 = 1333 X * 8 - X = 1333 X * 2^3 - X = 1333 (2^3: 2 elevado al cubo) X<<3 - X = 1333 (X<<3: X desplazado 3 bits a la izquierda)
En la ecuación X<<3 - X = 1333 observamos 3 elementos:
1333cuya representación binaria es00000000 00000000 00000101 00110101Xdel cual no conocemos ningún bit y por ello lo representaré así???????? ???????? ???????? ????????- Y
X<<3que esXcon un desplazamiento de 3 bits, es decir:???????? ???????? ???????? ?????000
Ahora vamos a mostrar la ecuación X<<3 = 1333 + X de forma más familiar:
1333 = 00000000 00000000 00000101 00110101 + X = ???????? ???????? ???????? ???????? ____ ___________________________________ X<<3 = ???????? ???????? ???????? ?????000
Hemos reducido el problema a una suma de números en base 2. Ahora podemos deducir uno a uno los bits de X sumando por
columnas como en la escuela. Por ejemplo: en la primera columna tenemos 1 + ? = 0 con lo cual deducimos que la
interrogante debe valer 1 y se genera un acarreo de 1 para la suma de la siguiente columna.
1 <----- acarreo
1333 = 00000000 00000000 00000101 00110101 +
X = ???????? ???????? ???????? ???????1
____ ___________________________________
X<<3 = ???????? ???????? ???????? ????1000
Y ya encontramos el primer bit de X.
Observe que como X<<3 es igual a X pero desplazado 3 bits a la izquierda, el primer bit de X es igual al cuarto
bit de X<<3.
En la segunda columna tenemos 1 + 0 + ? = 0. Nuevamente la interrogante debe ser 1 y llevamos un acarreo de 1 para
la siguiente operación.
11 <----- acarreo
1333 = 00000000 00000000 00000101 00110101 +
X = ???????? ???????? ???????? ??????11
____ ___________________________________
X<<3 = ???????? ???????? ???????? ???11000
Continuamos de esta manera hasta hallar todos los bits de X. Finalmente obtenemos:
11 11 111 <----- acarreo
1333 = 00000000 00000000 00000101 00110101 +
X = 00100100 10010010 01001001 11100011
____ ___________________________________
X<<3 = 00100100 10010010 01001111 00011000
Por último, pasando 00100100 10010010 01001001 11100011 a base decimal obtenemos 613566947.
Flag
