No cON Name CTF Pre Quals: Access Level 3

Selection_003.png

En este tercer y último reto nos enfrentamos a un fichero ELF. Este nivel fue el más fácil de los tres. Como veremos es súper sencillo.

Una vez bajamos el binario, lo primero es ejecutar file:

tuxotron@tuxotron-T530 ~/ctf/noconname2013quals $ file level.elf level.elf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xb589d432799bf15343387fea63d4bdc00faa177c, not stripped

Está compilado con símbolos y demás. Esto nos facilitará mucho la vida. Lo siguiente fue pasarle el comando strings, pero éste no arrojaba nada interesante.

Cuando ejecutamos el fichero se nos pide que introduzcamos por teclado una clave:

tuxotron@tuxotron-T530 ~/ctf/noconname2013quals $ ./level.elf

| > Type to win, only what I want to read… | >

Nada más pulsemos una tecla, si no es la que la aplicación espera, la aplicación termina:

tuxotron@tuxotron-T530 ~/ctf/noconname2013quals $ ./level.elf

| > Type to win, only what I want to read… | > | | -> I DON’T THINK SO

Echemos un vistazo al fichero desde gdb.

Una vez cargamos el ejecutable, desensamblamos el main:

(gdb) disassemble main

Aquí buscamos la función que nos pide entrada por teclado y rápidamente vemos que justo después de cada carácter, éste se compara con lo que hay almacenado en la dirección 0x6033a0: 0x00000000004010f3 <+212>: call 0x400fef < getch > // Entrada teclado 0x00000000004010f8 <+217>: movsx eax,al 0x00000000004010fb <+220>: mov DWORD PTR [rbp-0x4],eax 0x00000000004010fe <+223>: mov eax,DWORD PTR [rbp-0x8] 0x0000000000401101 <+226>: cdqe 0x0000000000401103 <+228>: mov eax,DWORD PTR [rax*4+0x6033a0] // Comparación 0x000000000040110a <+235>: cmp eax,DWORD PTR [rbp-0x4]

Si miramos lo que hay en esa dirección:

(gdb) x/30s 0x6033a0 0x6033a0 <facebookctf_rocks>: " " 0x6033a2 <facebookctf_rocks+2>: "" 0x6033a3 <facebookctf_rocks+3>: "" 0x6033a4 <facebookctf_rocks+4>: "S" 0x6033a6 <facebookctf_rocks+6>: "" 0x6033a7 <facebookctf_rocks+7>: "" 0x6033a8 <facebookctf_rocks+8>: "U" 0x6033aa <facebookctf_rocks+10>: "" 0x6033ab <facebookctf_rocks+11>: "" 0x6033ac <facebookctf_rocks+12>: "R" 0x6033ae <facebookctf_rocks+14>: "" 0x6033af <facebookctf_rocks+15>: "" 0x6033b0 <facebookctf_rocks+16>: "P" 0x6033b2 <facebookctf_rocks+18>: "" 0x6033b3 <facebookctf_rocks+19>: "" 0x6033b4 <facebookctf_rocks+20>: "R" 0x6033b6 <facebookctf_rocks+22>: "" 0x6033b7 <facebookctf_rocks+23>: "" 0x6033b8 <facebookctf_rocks+24>: "I" 0x6033ba <facebookctf_rocks+26>: "" 0x6033bb <facebookctf_rocks+27>: "" 0x6033bc <facebookctf_rocks+28>: "S" 0x6033be <facebookctf_rocks+30>: "" 0x6033bf <facebookctf_rocks+31>: "" 0x6033c0 <facebookctf_rocks+32>: "E" 0x6033c2 <facebookctf_rocks+34>: "" 0x6033c3 <facebookctf_rocks+35>: "" 0x6033c4 <facebookctf_rocks+36>: "!" 0x6033c6 <facebookctf_rocks+38>: ""

Vemos que el primer carácter es un espacio en blanco y luego SURPRISE! Si metemos eso como entrada al programa:

level.elf > enter: SURPRISE! | > Type to win, only what I want to read… | > ********** | | -> Congratulations! The key is: | 9e0d399e83e7c50c615361506a294eca22dc49bfddd90eb7a831e90e9e1bf2fb