Вы находитесь на странице: 1из 26

.: SOLUCION AL RETO 2014 :.

Equipo: SkU
Mr.Snow (SkUaTeR)
Mr.Khaki(thEpOpE)
WkT!Reloaded
Introduccion:
El viernes 21/02/2014 a las 18:00 comenzaba este reto. En un
principio pensaba participar yo solo (mr.snow) por lo que el equipo
lo registre como SkU (que viene de mi otro Nick SkUaTeR).
No se sobre que hora accedi a la pagina a ver los retos, creo que
fue ya sobre las 9 de la noche del viernes y centre mi atencin en uno
que se llamaba Magical Translation y adjuntaba un archivo llamado
rune esto me choco bastante ya que ando liado con el reto de
cicada3301 y su gematria primus usa estas runas. Ademas tengo a mi
novia entrenada en decodificar las runas de cicada as que me echo una
manilla para una aproximacin rpida.
Tras hacer una primera decodificacin e intentar meter el
resultado obtuve un bonito fallo. Por lo que me fui a cenar y no volv
a tocar nada ya hasta la madrugada. Despus de unas cuantas partidas a
HeartStone ;). Cuando heartstone perdi mi atencin me centr de nuevo
con el reto una vez mas me frustre al ver que no daba con la solucin
a las runas y lo dej.
El sbado sobre las 21:15 conecto a Skype un viejo amigo de
batallas al cual le comente de hacer equipo, a estas alturas ya tenia
resuelto un par de retos pero nada importante. Le coment que andaba
liado con este reto y que no consegua sacar nada de stargate
infinity.
[22/02/2014 21:13:00] Mr.Snow: buenas
[22/02/2014 21:20:26] Sergio pOpE: hola, estoy hablando por skype, cuano termine te
aviso
[22/02/2014 21:20:33] Mr.Snow: oki ;)
[22/02/2014 21:28:50] pOpE: yep, ya estoy
[22/02/2014 21:29:06] Mr.Snow: has visto la competi de la rooted?
[22/02/2014 21:29:09] pOpE: al fnal me he apuntado a la rooted
[22/02/2014 21:29:17] pOpE: s, he visto que estn ahi los w0pr a tope
[22/02/2014 21:29:34] pOpE: yo hasta esta tarde a eso de las 20.00 no me he podido
[22/02/2014 21:29:41] pOpE: ayer y hoy he tenido bastante "curro"
[22/02/2014 21:30:01] Mr.Snow: estas libre ahora?
[22/02/2014 21:30:04] Mr.Snow: hacemos ekipo?
[22/02/2014 21:34:41] pOpE: jeje, ando liadillo ; el problema ue tengo es que maana
tengo que madrugar
[22/02/2014 21:34:47] pOpE: :(
[22/02/2014 21:35:26] Mr.Snow: aps ok, yo eske tengo 3 resueltas ya pero una ke tengo a
medias me esta matando y es necesaria para continuar
[22/02/2014 21:36:04] pOpE: mandamela, y le echo un ojo, o es online??
[22/02/2014 21:38:07] pOpE: te deca que me he apuntado al final a la rooted, me li la
manta a la cabeza, y para all que me voy... pondr en el twitter a ver quienes van ....
:/ porque imagino que me encontrar por all gente conocida
[22/02/2014 21:41:18] Mr.Snow: https://arena.rootedcon.es/challenges
Como podis ver en la conversacin, thEpOpE tenia cosas mas
importantes que hacer pero:
acaso conocis algn reverse que se precie que no le pique el
gusanillo?
Pues thEpOpE no iba a ser menos y acab mas liado que un ovillo.
<EOF>
Prueba 1 - Damaged File:
Arriba podis ver el enunciado de la prueba y el archivo que nos
dan para poder resolverla.
Tras descargar el archivo y visualizarlo con un editor hexadecimal nos
damos cuenta de que realmente es un .bmp el cual contiene esta imagen:
La imagen parece defectuosa pero ha sido creada as
intencionadamente.
Aqu thEpOpE comenz a hacer su magia y analizo la paleta de
colores donde se dio cuenta de que los colores de la paleta con ndice
impar se igualaban al color par. En un principio se pens que estos
colores ocultaban algn tipo de artefacto en la imagen, pero esto fue
rpidamente descartado tras comprobar que la imagen no usaba ninguno
de los colores con ndices impares de la paleta.
Analizamos el archivo y nos vamos a la posicin 0x436, offset que
la cabecera del BMP nos revela como lugar donde estn codificados los
pixels (al ser una imagen con paleta de 8 bits, cada byte es un indice
de la paleta, de donde se toma el color para ese pixel). Aqu thEpOpE
se dio cuenta que desde 0x436 hasta 0x4b3 siempre el ultimo bit esta a
0 o 1, mientras que en el resto del archivo siempre esta a 0.
Este detalle le hizo pensar que aqu haba algo, sacando cuentas
salen un total de 120bits que serian 15 bytes.
Con un pequeo script en python se recuperaron esos bits y se
compusieron en bytes, interpretndolos de 8 en 8, el resultado fue una
cabecera con 0x0D,0x00,0x00 y la cadena: txt,00t3D2014 (smbolo de
la coma no es el habitual, sino el carcter 0x82).
Entendemos que el valor 0x82 es el carcter r con un bit
modificado para indicar al propio programa de esteganografa que ah
empiezan los datos en formato txt. (0x82 = r+0x10h)
Script de python usado:
entrada = open('original.bmp','rb')
encriptado = entrada.read()
entrada.close()
i = 0x436
salida = open ('binario.txt','wb')
while i < len(encriptado):
bitbajo = ord(encriptado[i]) & 1
salida.write(chr(48+bitbajo))
i += 1
salida.close()
SOLUCION: r00t3D2014
Prueba 2 Invisible Evidence:
En esta prueba nos proporcionan un archivo .pcap yo jams he
trabajado con herramientas que interpreten estos archivos.
Por lo tanto tirando de google aterrice en la siguiente utilidad:

NetwrokMiner (http://www.netresec.com/?page=NetworkMiner)
La utilidad por si sola nos hace todo el trabajo y solo es
necesario indicarle el fichero .pcap a analizar y el programa nos
muestra toda la informacin perfectamente clasificada en pestaas:
Si nos fijamos en la pestaa de Messages podemos ver una
conversacin entre el malo-malote y su novia mariam.
En cierto momento le pasa una direccin de pastebin la cual debe
de contener algo importante:
http://pastebin.com/fir3C2kY
Accedemos a dicha direccin y obtenemos la siguiente clave:
wCgwZTEt5W3i
Recomiendo a todo el mundo que ojee lo que es capaz de obtenerse
de un .pcap realmente es algo que da miedo. Este programa te muestra
hasta una galera con las imgenes que se capturaron en la sesin.
SOLUCION: wCgwZTEt5W3i
Prueba 3 Double-Cross:
Esta vez nos dan un archivo .PDF que ha sido interceptado y se
supone que debe contener informacin preciosa ;).
Tras ver que el documento muestra datos tcnicos en alemn,
descartamos que el contenido del pdf sea lo que buscamos.
Asi pues vamos a echarle un ojo con un editor hexadecimal:
Si nos fijamos en el final del archivo vemos cosas extraas y una
marca bastante conocida PK. Lo que podra indicar y de hecho es lo que
hace, la presencia de un contenedor ZIP, despus del %%EOF del .PDF.
Simplemente renombramos el archivo a .7z y lo descomprimimos,
obteniendo asi el archivo readme.txt con el siguiente contenido:

knxjjP5SI7P3IH8cQd92
SOLUCION: knxjjP5SI7P3IH8cQd92
Prueba 4 The domain:
Aunque parezca mentira de lejos esta fue para nosotros la prueba
mas difcil. Ya que no sabamos a ciencia cierta que se nos pedia, al
final en el ultimo momento y gracias a la insistencia de mi chica
(hooola Pekeniaja) conseguimos resolverla.
Esta vez se nos adjunta un archivo dominio.txt el cual contiene
la siguiente URL: http://pastebing.com
Comenzamos haciendo un whois al dominio: http://pastebing.com :
Registrant Name: Raul Gomez
Registrant Organization: Raulillo
Registrant Street: C/ Es Calo 34
Registrant City: Ibiza
Registrant State/Province: Illes Balears
Registrant Postal Code: 07830
Registrant Country: ES
Registrant Phone: +34.657659462
Registrant Phone Ext:
Registrant Fax:
Registrant Fax Ext:
Registrant Email: gomezraul134@gmail.com
Registry Admin ID: DI_32932341
Admin Name: Raul Gomez
Admin Organization: Raulillo
Admin Street: C/ Es Calo 34
Admin City: Ibiza
Admin State/Province: Illes Balears
Admin Postal Code: 07830
Admin Country: ES
Admin Phone: +34.657659462
De aqu extraemos como til el email: gomezraul134@gmail.com .
Siguiendo las pistas nos dicen que busquemos en las redes sociales
por lo tanto vamos a la reina de estas FaceBook y llegamos a esta
pagina:
En la foto con la novia se como le dice a su novia Mariam I love
you (estuvimos mucho tiempo dndole vueltas, hicimos una bsqueda de
la imagen de perfil en images.google, buscando imgenes similares, y
llegamos a saber que la foto es realmente de una pareja de americanos
que ambos tienen el mismo nombre y apellido (Kelly Hildebrandt)
estuvimos dndole vueltas sin resultado hasta que se nos ocurri poner
el nombre de la chica en la casilla de verificacin.
Gracias MARTA!!!)
SOLUCION: Mariam
Prueba 5 QR Recomposition:
Esta vez nos dan un .PDF el cual al abrirlo nos da error de
contenidos de una fuente, y nos muestra una imagen bastante feota ;)
Inicialmente pensamos que puede ser un error de offsets, y de
recomposicin de un jpg mal interpretado en el PDF, pero con un editor
hexadecimal extraemos el jpg, y descubrimos que no est mal
interpretado por el PDF, sino que el jpg es justo lo que se ve. Trozos
de un QR desordenados.
En la imagen se aprecian partes de un cdigo QR pero por desgracia
no hay informacin sobre la parte inferior derecha del QR porque algn
gracioso apoy all su libreta
Una vez mas thEpOpE consigue identificar los Finder Patters y los
Timing Patters para conseguir orientar las distintas partes del QR.
Ninguna de las partes est rotada, por lo que la tarea de
recomposicin no parece aparentemente complicado, excepto el fragmento
tapado por la libreta.
Mas adelante (resolviendo la prueba n 6) dentro del servidor
arena2.rootedcon.es en el directorio /home/peter/ localic un archivo
llamado: .QR_code el cual contena la siguiente url:
http://i59.tinypic.com/ws4bro.jpg que result ser justo la parte del
QR que nos faltaba:
La parte izquierda vertical, si nos fijamos, corresponde a lo que
est debajo del Finder Pattern superior derecho. Es ms, lo podemos
comprobar, porque ah est parte del Format String del QR, que adems
con los otros Finder Pattern podemos verificar que son del mismo
cdigo. La parte inferior derecha de este ltimo trozo, se identifica
perfectamente con los patrones que hay junto a las anillas del
cuadernos que tapa.
Como la imagen est Girada 90 a la izquierda, basta con girarla
90 a la derecha. Con toda esta informacin thEpOpE fue capaz de
recomponer o mejor dicho de pintar de nuevo todo el cdigo QR.
Realmente era ms facil dibujar de nuevo el QR que andar recortando
los trozos del jpg; y tras escanearlo con una aplicacin mvil (i-
nigma) obtenemos: Welcome2Rooted5
SOLUCION: Welcome2Rooted5
Prueba 6 Stargate Infinity:
Aqu empieza la verdadera chicha del concurso. Nos proporcionan un
fichero passwd el cual contiene varios nombres de usuarios, adems de
proporcionarnos un par de pistas sobre el servidor a conectar y que
las contraseas deberas ser seguras.
Cuando intentamos acceder a arena2.rootedcon.es con el navegador
obtenemos un mensaje de error indicando BAD GATEWAY. Lo que nos hizo
pensar que habra que entrar por otro puerto. Aqu se me hizo la
cabeza un lio ya que obtuve varios puertos con un simple scan NMAP y
anduve un buen rato dando palos de ciego, hasta que thEpOpE realiz el
mismo scan NMAP pero hacia todos los puertos (nmap -p1-65535 ):
PORT STATE SERVICE
25/tcp open smtp
53/tcp open domain
80/tcp open http
443/tcp open https
587/tcp closed submission
7029/tcp closed unknown
7890/tcp closed unknown
8181/tcp open unknown
9998/tcp open distinct32 IRCD
9999/tcp open abyss
22445/tcp open unknown OpenSSH
22998/tcp open unknown OpenSSH
22999/tcp open unknown OpenSSH
24445/tcp closed unknown
Finalmente determinamos que el puerto a usar es el 22445 ya que si
se conecta a l e introducimos un usuario aparece el dibujo de un
STARGATE. Tras probar con la combinacin mas fcil usando como
password el mismo nombre que el de usuario llegamos a hacer login. As
pues la informacin de conexin es:
SSH: arena2.rootedcon.es:22445
username: thomas
password: thomas
Una vez dentro hacemos un cat /etc/passwd y obtenemos todos los
users:
[...]
marc:x:1005:1005:Marc Rowlands,,,:/home/marc:/bin/bash
jules:x:1006:1006:Jules Verne,,,:/home/jules:/bin/bash
thomas:x:1000:1000:Thomas Jefferson,,,:/home/thomas:/bin/bash
Y vemos como thomas su nombre real es Thomas Jefferson. Como
el reto nos dice que indiquemos quien dejo la puerta abierta.
SOLUCION: Thomas Jefferson
Prueba 7 Round [OR]:
Aparentemente necesitamos algo con lo que trastear y aqu no hay
nada. Ya el domingo por la maana haciendo el parra dentro del
servidor de arena2.rootedcon.es me dio por mirar el home de los otros
usuarios y BINGOO dentro de cada uno de los users estaban cada uno
de los ejecutables necesarios para las pruebas de ROUND y un archivo
QR.
Proced a conectarme por SCP y descargar todo el /home/
En este punto del reto estbamos ya a pocas horas del final. Por
lo tanto thEpOpE se puso a trabajar.
El primer check que detectamos es que aunque el programa nos
indica una longitud mnima y mximo, a la hora de la verdad, verifica
que el password sea de 12 caracteres de longitud.
.text:0000000000400765 mov rax, [rbp+sPassword]
.text:0000000000400769 mov rdi, rax
.text:000000000040076C call near ptr qword_40AF50+0B10h
.text:0000000000400771 mov [rbp+var_24], eax
.text:0000000000400774 cmp [rbp+var_24], 0Ch
.text:0000000000400778 jz short loc_400786
Despus a la clave introducida le aplica una primera
transformacin:
A los cuatro primeros caracteres les suma $, 0, 4, y )
respectivamente a cada uno de ellos. En el siguiente fragmento de
cdigo se ve que va guardando cada carcter transformado
consecutivamente en var_3D, var_3E, var_3F...
A los cuatro siguientes, les resta 2, 4, 6 y 8 unidades
respectivamente. En el cdigo cada carcter es referenciado
individualmente, se ve como en rax se suma, 4, 5, 6 y 7 para acceder a
ellos, y se les resta los valores como inmediatos.
En este punto, se aade carcter a carcter PADDING0:
A los cuatro ltimos caracteres de la clave, les suma la unidad.
Este fragmento se parece mucho a la transformacin de los 4 primeros,
salvo que aqu carga en rdx una variable global, para hacer la suma:
A esta cadena obtenida de este modo, la convierte a base64, y la
compara en 0x400962 con una cadena hardcodeada. Realmente la cadena
est hardcodeada en pequeos fragmentos, que los ha concatenado
previamente, resultando: kJGXlV9yXzVQQURESU5HMDI0NDg=
Para revertirlo, convertimos esta cadena de base64 a la cadena
original, para ello uso un conversor online:
http://www.motobit.com/util/base64-decoder-encoder.asp
Nos da como resultado: _r_5PADDING02448; y le aplicamos las
transformaciones inversas a la transformacin que se la ha hecho
inicialmente a la clave. Es decir, a los 4 primeros dgitos les
restamos: $04) respectivamente, a los cuatro siguientes les sumamos
2, 4, 6 y 8; y a los 4 ltimos les restamos 1. Retiramos PADDING0,
ya que no forma originalmente parte de nuestra clave y lo ha aadido
en el proceso transformacin, y obtenemos la clave deseada.
SOLUCION: laclave=1337
Prueba 8 Round [XOR]:
Para afrontar este reto necesitaremos trazar el programa, usaremos
EDB en concreto la versin para archivos de 64 bits.
Tambin sera de gran ayuda un desensamblado del programa usaremos
IDA PRO para obtenerlo y as facilitar la tarea de poner BreakPoints.
Actuaremos como para cualquier programa a crackear, buscaremos
cadenas de texto que nos faciliten el proceso, como pueden ser los
mensajes de correcto o incorrecto en este caso:
Podemos apreciar las cadenas CORRECT y WRONG. Si usamos las
referencias cruzadas podemos ir al punto donde se cargan estas
cadenas.
En el offset 0x4005DD se produce la llamada a la rutina que mira
si tenemos un password correcto.
Dentro de esta funcin el programa llama a GetEnv() para obtener
el valor de la variable: ENV_KEY_VAR y luego lo compara con un string
que crea usando cadenas estticas mediante la funcin sprintf.
Con toda esta informacin estamos listos para cargar el debugger
poner un BPX en la direccin 0x40065c y ponernos a jugar con los
valores ;)
Tras detenernos en el breakpoint falsearemos el resultado de EAX
para que no valga 0 (de momento no hemos asignado la variable que
busca por lo tanto falseamos para ver la composicin del string con el
que compara) y trazamos paso a paso hasta llegar al sprintf que
compone la cadena:
En 0x4006C4 tenemos la llamada al sprintf la ejecutamos, avanzamos
un par de instrucciones hasta ver como en el registro RDX, carga la
clave a comparar: mivozesmipasaporte.
Este anlisis lo he realizado a posteriori ya que en cuanto vi la
carga de la primera frase mivozesm me vino a la cabeza una pelcula
los fisgones donde usan precisamente esa clave ;)
http://www.youtube.com/watch?v=-zVgWpVXb64
SOLUCION: mivozesmipasaporte
Prueba 9 Round [AND]:
Procedemos igual que en el reto anterior usaremos IDA PRO para
obtener un desensamblado del ejecutable. Y localizaremos de nuevo las
cadenas de texto que usa el programa, para poder determinar la rutina
de testeo.
Usamos las referencias cruzadas para ir al cdigo que cargara la
cadena de CORRECT, esto nos lleva al Offset 0x40094F el cual llama a
la funcin que iniciara las comprobaciones (0x40098B).
Si Avanzamos dentro de esta funcin podemos ver otra llamada en el
offset 0x400A17 y justo debajo se ve un salto condicional:
La llamada a 0x400740 (TEST) simplemente hace una comparacin de
las cadenas pasadas en los registros RSI y RDI, por lo tanto si
ponemos un BPX en 0x400A17 podremos ver los strings que comapara.
Una vez mas usaremos EDB para que nos muestre estas cadenas de
texto:
Primero iremos a Options->Aplication Arguments y aadiremos el
argumento a pasar al programa, en mi caso skuater123456. Despus
cargaremos el archivo and y pondremos un BPX en la direccion 400A17.
Pulsamos F9 para que ejecute y pare en nuestro breakpoint.
Se puede ver como RSI contiene la clave que pasamos por parmetro
al programa y RDI la clave con la que va a compararla:
fe00f30fbebe0000aabbf1f2f3f4
SOLUCION: fe00f30fbebe0000aabbf1f2f3f4
Prueba 10 Round [NOR]:
Procederemos a realizar el tpico anlisis esttico usando IDA
PRO. Se puede usar cualquier desensamblador que soporte 64 bits, yo
uso IDA PRO ya que en su da aprend a usarlo y me parece de los mas
completos la nica pega su elevado precio aunque los chicos de Hex-
Rays siempre nos dejan probar una versin capada, por desgracia para
desensamblar x64 sera necesaria la versin pro.
Procedemos a buscar strings que nos ayuden en el anlisis:
Vamos a centrarnos en OK PROCESSING, usamos las referencias
cruzadas y vamos a la posicin donde carga esta cadena. Esta vez
nuestra aproximacin sera un poco distinta. Vamos a ir al principio de
la rutina que contiene la carga del string ok processing la cual
comienza en 0x40BB0 volvemos a usar las referencias cruzadas para ver
quien invoca a esta funcin:
Observamos como la funcin es pasada por referencia a una funcin
de la librera CURL. Esto significa que seguramente todo el sistema de
validacin lo realiza esta funcin 0x400BB0 as que nos centraremos en
ella.
Esta funcin a grandes rasgos se encarga de cargar una gran string
que gracias a la librera CURL a sido descarga de la URL:
http://pastebin.ca/raw/2310855
Y despus realiza unas comparaciones BYTE a BYTE:
Si todas las comparaciones (6 en total) son correctas se procesa
el string recibido que simplemente es escribirlo en /tmp/arena2014.001
Este es el contenido del archivo:
-----BEGIN DH PARAMETERS-----
MIGHAoGBALfVTCUXxo4ATBkD1x4S0GFcpdOgvV3Vffdmrs2KvvX3exITOFHYonD0
/91/revEWEjI8NH6GDyP31Bio/fPyWz9Ex6woUQ2BSwWneuS5lgor+AcvOi7CxKT
Ze/0H87M0LlLPbmEp4nRsV4JobV/YduCALWKIYSnNzm/mAPHjgYrAgEC
-----END DH PARAMETERS-----
Las comparaciones son con los bytes de la clave pasada como
parmetro y lo compara con: 5 4 5 4 5 4
Adjunto aqu debajo todo el cdigo que realiza las comparaciones:
.text:0000000000400C7D cdqe
.text:0000000000400C7F movzx edx, ds:byte_4010C0[rax]
.text:0000000000400C86 movzx eax, cs:byte_601A54
.text:0000000000400C8D cmp dl, al <-----1 comparacin falseamos y
apuntamos valores
.text:0000000000400C8F jz short loc_400C98
.text:0000000000400C91 mov [rbp+var_8], 0
.text:0000000000400C98
.text:0000000000400C98 loc_400C98: ; CODE XREF: su
.text:0000000000400C98 add [rbp+var_18], 1
.text:0000000000400C9C mov eax, [rbp+var_20]
.text:0000000000400C9F cdqe
.text:0000000000400CA1 movzx edx, ds:byte_4010C0[rax]
.text:0000000000400CA8 movzx eax, cs:byte_601A55
.text:0000000000400CAF cmp dl, al <-----2 comparacin falseamos y
apuntamos valores.
.text:0000000000400CB1 jz short loc_400CBA
.text:0000000000400CB3 mov [rbp+var_8], 0
.text:0000000000400CBA
.text:0000000000400CBA loc_400CBA: ; CODE XREF: su
.text:0000000000400CBA mov eax, [rbp+var_24]
.text:0000000000400CBD cdqe
.text:0000000000400CBF movzx edx, ds:byte_4010C0[rax]
.text:0000000000400CC6 movzx eax, cs:byte_601A56
.text:0000000000400CCD cmp dl, al <-----3 comparacin
falseamos y apuntamos valores
.text:0000000000400CCF jz short loc_400CD8
.text:0000000000400CD1 mov [rbp+var_8], 0
.text:0000000000400CD8
.text:0000000000400CD8 loc_400CD8: ; CODE XREF: su
.text:0000000000400CD8 mov eax, [rbp+var_28]
.text:0000000000400CDB cdqe
.text:0000000000400CDD movzx edx, ds:byte_4010C0[rax]
.text:0000000000400CE4 movzx eax, cs:byte_601A57
.text:0000000000400CEB cmp dl, al <-----4 comparacin falseamos y
apuntamos valores
.text:0000000000400CED jz short loc_400CF6
.text:0000000000400CEF mov [rbp+var_8], 0
.text:0000000000400CF6
.text:0000000000400CF6 loc_400CF6: ; CODE XREF: su
.text:0000000000400CF6 mov eax, [rbp+var_2C]
.text:0000000000400CF9 cdqe
.text:0000000000400CFB movzx edx, ds:byte_4010C0[rax]
.text:0000000000400D02 movzx eax, cs:byte_601A58
.text:0000000000400D09 cmp dl, al <----- 5 comparacin falseamos y
apuntamos valores
.text:0000000000400D0B jz short loc_400D14
.text:0000000000400D0D mov [rbp+var_8], 0
.text:0000000000400D14
.text:0000000000400D14 loc_400D14: ; CODE XREF: su
.text:0000000000400D14 mov eax, [rbp+var_30]
.text:0000000000400D17 cdqe
.text:0000000000400D19 movzx edx, ds:byte_4010C0[rax]
.text:0000000000400D20 movzx eax, cs:byte_601A59
.text:0000000000400D27 cmp dl, al <-----6 comparacin falseamos y
apuntamos valores
.text:0000000000400D29 jz short loc_400D32
.text:0000000000400D2B mov [rbp+var_8], 0
.text:0000000000400D32
.text:0000000000400D32 loc_400D32: ; CODE XREF: su
.text:0000000000400D32 cmp [rbp+var_8], 1
.text:0000000000400D36 jnz short loc_400D5F
.text:0000000000400D38 mov edi, offset aOkProcessing__ ; "
Para reproducir los pasos seguidos, simplemente cargar EDB
configurar el parmetro de entrada del programa a algo con 6
caracteres (123456) y poner un BPX en 0x400C8D y ejecutar el
programa, nos detendremos en la primera comprobacion y veremos como
comprueba un valor (5) con (1) que corresponde a nuestra clave
introducida, ajustamos la variable que contenga en 1 a 5 y ejecutamos
paso a paso hasta llegar al siguiente CMP dl,al repetimos la misma
operacin hasta llegar a 0x400D36. Donde veremos como carga la cadena
de OK PROCESSING y finalmente escribe el archivo en disco.
Aqui os dejo las posiciones de memoria donde guarda la clave:
bss:0000000000601A54 ; .text:00000000
bss:0000000000601A55 byte_601A55 db ? ; DATA XREF: sub
bss:0000000000601A56 byte_601A56 db ? ; DATA XREF: sub
bss:0000000000601A57 byte_601A57 db ? ; DATA XREF: sub
bss:0000000000601A58 byte_601A58 db ? ; DATA XREF: sub
bss:0000000000601A59 byte_601A59 db ? ; DATA XREF: sub
SOLUCION: 545454
Prueba 11 Round [XNOR]:
Sin duda este reto ha sido el mas difcil, no por el cdigo en s
sino porque la herramienta EDB no funciona muy fina con los FORKS o
por lo menos yo no he sabido usarla correctamente. As que fuimos a lo
bruto: y analizamos gran parte del trabajo como cdigo muerto.
Bsicamente lo que hemos hecho ha sido falsear valores y evitar la
ejecucin de los FORKS para poder llegar al proceso hijo que realizaba
los clculos para ello cargamos el programa en EDB y ponemos un BPX en
el primer _fork que se encuentra en el offset 0x400935 cambiamos al
EIP a la siguiente instruccin para que no se realice el call _fork
editamos EAX y la ponemos a 0 y seguimos ejecutando paso a paso:
.text:0000000000400925 add eax, eax
.text:0000000000400927 add eax, edx
.text:0000000000400929 shl eax, 2
.text:000000000040092C mov [rbp+var_8], eax
.text:000000000040092F nop
.text:0000000000400930 call sub_4008AA <----------------- Inicializa los
valores que se usaran en el calculo
.text:0000000000400935 call _fork <---- ignoramos este fork
.text:000000000040093A mov [rbp+var_10], eax <----- ponemos eax =0
.text:000000000040093D mov eax, [rbp+var_10]
.text:0000000000400940 cmp eax, 0FFFFFFFFh
.text:0000000000400943 jz short ErrorEnvi
.text:0000000000400945 test eax, eax
.text:0000000000400947 jz short loc_400962 <------- Saltamos a este punto del
programa.
.text:0000000000400949 jmp Fork1
.text:000000000040094E ; -----------------------------------------------------
Continuamos trazando con EDB:
.text:0000000000400962 loc_400962: ; CODE XREF: su
.text:0000000000400962 mov ecx, 1
.text:0000000000400967 mov edx, 1A4h
.text:000000000040096C mov esi, 40h ; oflag
.text:0000000000400971 mov edi, offset name ; "/seisSem"
.text:0000000000400976 mov eax, 0
.text:000000000040097B call _sem_open
.text:0000000000400980 mov [rbp+sem], rax
.text:0000000000400984 mov edx, cs:dword_6012A8
.text:000000000040098A mov eax, cs:dword_6012AC
.text:0000000000400990 add eax, edx
.text:0000000000400992 mov cs:dword_6012A8, eax
.text:0000000000400998 cmp [rbp+sem], 0
.text:000000000040099D jnz short loc_4009BD <---------------
Seguimos este salto.
.text:000000000040099F mov edi, offset aProblemsCrea_0 ; "
.text:00000000004009A4 call _perror
.text:00000000004009A9 mov edi, offset name ; "/seisSem"
.text:00000000004009AE call _sem_unlink
.text:00000000004009B3 mov edi, 0FFFFFFFFh ; status
...
...
...
Continuamos trazando sin necesidad de alterar nada:
.text:00000000004009BD loc_4009BD: ; CODE XREF: su
.text:00000000004009BD mov edx, cs:dword_6012A8
.text:00000000004009C3 mov eax, cs:dword_6012C0
.text:00000000004009C9 imul eax, edx
.text:00000000004009CC mov cs:dword_6012A8, eax
.text:00000000004009D2 mov edx, cs:dword_6012A8
.text:00000000004009D8 mov eax, cs:dword_6012C4
.text:00000000004009DE add eax, edx
.text:00000000004009E0 mov cs:dword_6012A8, eax
.text:00000000004009E6
.text:00000000004009E6 loc_4009E6: ; CODE XREF: su
.text:00000000004009E6 mov [rbp+sval], 0FFFFFFFFh
.text:00000000004009ED mov [rbp+var_1C], 0FFFFFFFFh
.text:00000000004009F4 lea rdx, [rbp+sval]
.text:00000000004009F8 mov rax, [rbp+sem]
.text:00000000004009FC mov rsi, rdx ; sval
.text:00000000004009FF mov rdi, rax ; sem
.text:0000000000400A02 call _sem_getvalue
.text:0000000000400A07 mov [rbp+var_1C], eax
.text:0000000000400A0A mov eax, [rbp+sval]
.text:0000000000400A0D cmp eax, 0FFFFFFFFh
.text:0000000000400A10 jz short loc_400A5B
.text:0000000000400A12 mov edx, [rbp+sval]
.text:0000000000400A15 mov eax, cs:dword_6012A8
.text:0000000000400A1B cmp edx, eax <-- y aqu esta la comparacin 0x64b207 y
0x5c8 igualamos eax y edx a 0x64b207
.text:0000000000400A1D jnz short loc_400A38
.text:0000000000400A1F mov eax, cs:dword_6012A8
.text:0000000000400A25 mov esi, eax
.text:0000000000400A27 mov edi, offset aCorrectKeyLd ; "CO
.text:0000000000400A2C mov eax, 0
.text:0000000000400A31 call _printf <--- Y nuestro amigo
printf nos muestra la solucin
.text:0000000000400A36 jmp short loc_400A5B
.text:0000000000400A38 ; -----------------------------------------------------
Finalmente llegamos al _printf el cual nos va a dar nuestra
preciada clave tras realizar las modificaciones arriba descritas.
CORRECT: key: [6599175]
Casi todo el anlisis lo hemos hecho en cdigo muerto y solo hemos
usado el debugger para obtener los valores rpidamente. De este modo
no hay que usar calculadoras tipo win8 :p, aunque para muestra un
botn, el hard-paper-ware con anotaciones:
Parece ser que la lgica del programa tiene que ver con los
procesos creados y cuando el semforo llega a un numero concreto
muestra el resultado.
De todas formas todo el anlisis y la solucin se puede conseguir
sin ejecutar una sola lnea de cdigo , simplemente hay que isolar
la comunicacin entre el proceso padre y los hijos.
SOLUCION: 6599175
Prueba 12 Magical Translation:
Esta prueba nos pide que hagamos una traduccin y nos dan un
archivo .png el cual contiene lo siguiente:
Claramente es Elder Futhark. Y lo tengo tan claro ya que en otros
retos como el de cicada llevan usando esta codificacin desde su
segundo ao. Podemos buscar en google rune translate y rpidamente
veremos muchas runas parecidas.
(esta parte me hizo realizar muchas pruebas ya que no sabia
exactamente que formato se peda y la traduccin original de Futhark
no tiene ni Y ni C exclusivas al igual que V. Para estos caracteres se
usan I K y U. Por lo tanto la traduccin original es: iou are welkome)
SOLUCION: you are welcome
Prueba 13 Blind Dialing:
Nos piden encontrar los nmeros ocultos.
Este archivo es un archivo de sonido, si lo reproducimos con VLC
podemos escuchar distintos tonos DTMF (los que suenan al pulsar el
teclado del mvil). Los tonos DTMF son tonos con 2 frecuencias, por lo
que viendo la tabla de frecuencias de la onda se puede hacer una
anlisis manual, pero optamos por la va ms sencilla y rpida.
Usamos el propio VLC para convertir el archivo a .wav y lo pasamos
por la siguiente WEB: http://www.dialabc.com/sound/detect/index.html
RESULTADO: 0034668878045