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:
1333
cuya representación binaria es00000000 00000000 00000101 00110101
X
del cual no conocemos ningún bit y por ello lo representaré así???????? ???????? ???????? ????????
- Y
X<<3
que esX
con 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
.