Desafío ESET #35: Obtén la bandera y tu entrada gratuita para ekoparty

El día de hoy damos inicio al Desafío ESET #35 para sortear una entrada a la 13° edición de ekoparty, la reconocida conferencia de seguridad que tiene lugar cada año en Argentina. Se realizará los días 27, 28 y 29 de septiembre en Ciudad Cultural Konex, Buenos Aires, y allí se reunirán, como cada año, especialistas en TI, hackers, investigadores de seguridad, sysadmins, CISOs y muchos entusiastas de la industria para compartir hallazgos, talleres, desafíos, juegos y unos cuantos tragos.

La consigna de nuestro desafío es encontrar la bandera que te garantizará el acceso gratuito al ciclo de conferencias de ekoparty; para ello, deberás poner en práctica tus conocimientos en ingeniería inversa y encontrar la información necesaria para acceder a los archivos del reto.

A lo largo de los siguientes días estaremos resolviendo dudas y dando pistas a los comentarios en privado, pero no publicaremos aquellos que incluyan la solución o parte de ella hasta que tengamos un ganador; lo anterior con el propósito de que no se interfiera con los resultados y avances de otros participantes.

Si eres el primero en comentar en este artículo la respuesta correcta completa, ganarás la entrada para acceder sin cargo a los tres días de conferencia (recuerda que el traslado corre por tu cuenta).

El ganador será dado a conocer el miércoles 13 de septiembre, junto con la solución del reto. Tienes tiempo hasta entonces para poner manos a la obra y resolver el desafío.

Entonces, ¿cuál es la consigna?

  1. Descarga el downloader para dar inicio al desafío
  2. Encuentra la información necesaria para llegar al ejecutable
  3. Usa tus conocimientos de ingeniería inversa para obtener la bandera
  4. Cuéntanos en los comentarios cuál es la respuesta y qué herramientas o procesos usaste para llegar a ella

Si eres el primero en publicar la solución correcta detallando el proceso completo, ganarás tu entrada para ekoparty. Si hay más de un participante que merece el premio, evaluaremos la posibilidad de entregar más de una entrada para reconocer su tiempo y esfuerzo.

¿Qué esperas para resolver el desafío? Mucha suerte y nos vemos en ekoparty. ¡Happy reversing!

Autor , ESET

  • Rafael Lior

    Color y codificacion !

  • Martin Fmas

    No me permite bajar el archivo no tengo permisos. Probe la URL de todas las formas
    https://www.welivesecurity.com/wp-content/uploads/D3SAF10_ESET_35.ZIP
    https://www.welivesecurity.com/wp-content/uploads/2017/08/D3SAF10_ESET_35.ZIP

    y cambiando la fecha. Me da pagina no encontrada.
    Saludos.

    • Miguel Ángel Mendoza

      Qué tal Martín,

      Verifica las mayúsculas y minúsculas en la URL que considera la fecha.

      Saludos!

    • Rafael Lior

      Te falta una decodificar mas funciones.

  • tirogatomulo

    Al ver la extension del downloader , chequeando el signature con un editor hexadecimal, utilize oledump(https://blog.didierstevens.com/programs/oledump-py/) para extraer la macro.

    NewMacros.vba

    Attribute VB_Name = “NewMacros”
    Sub downloader()
    MsgBox “Busca la URL para la descarga del archivo y la contraseña que lo descomprime”
    End Sub

    ‘Function Cifrado1()
    ‘Private Const ALG_CLASS_ANY As Long = 0 Private Const ALG_TYPE_ANY As Long = 0
    ‘ 70 69 7a 2e 35 33 5f 54 45 53 45 5f 30 31 46 41 53 33 44
    ‘ Private Const ALG_CLASS_HASH As Long = 32768
    ‘ Private Const ALG_TYPE_BLOCK As Long = 1536
    ‘ Private Const ALG_CLASS_DATA_ENCRYPT As Long = 24576
    ‘ Private Const ALG_SID_RC2 As Long = 2
    ‘ Private Const ALG_SID_SHA1 As Long = 4
    ‘ Private Const CALG_SHA1 As Long = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
    ‘ Private Const CALG_RC2 As Long = ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_RC2
    ‘ Private Const PROV_RSA_FULL As Long = 1
    ‘ Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000
    ‘ Private Const MS_DEFAULT_PROVIDER As String = “Función de cifrado 1”
    ‘ Private Const CRYPT_NO_SALT As Long = &H10
    ‘End Function

    ‘Function Cifrado2()
    ‘Private Const ALG_CLASS_ANY As Long = 0 Private Const ALG_TYPE_ANY As Long = 0
    ‘ Private Const ALG_CLASS_HASH As Long = 32768
    ‘ Private Const ALG_TYPE_BLOCK As Long = 1536
    ‘ Private Const ALG_CLASS_DATA_ENCRYPT As Long = 24576
    ‘ Private Const ALG_SID_RC2 As Long = 2
    ‘ Private Const ALG_SID_SHA1 As Long = 4
    ‘ Private Const CALG_SHA1 As Long = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
    ‘ Private Const CALG_RC2 As Long = ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_RC2
    ‘ Private Const PROV_RSA_FULL As Long = 1
    ‘ Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000
    ‘ Private Const MS_DEFAULT_PROVIDER As String = “Función de cifrado 2”
    ‘ Private Const CRYPT_NO_SALT As Long = &H10
    ‘ 00101111 00111000 00110000 00101111 00110111 00110001 00110000 00110010
    ‘End Function

    ‘Function Cifrado3()
    ‘Private Const ALG_CLASS_ANY As Long = 0 Private Const ALG_TYPE_ANY As Long = 0
    ‘ Private Const ALG_CLASS_HASH As Long = 32768
    ‘ Private Const ALG_TYPE_BLOCK As Long = 1536
    ‘ Private Const ALG_CLASS_DATA_ENCRYPT As Long = 24576
    ‘ Private Const ALG_SID_RC2 As Long = 2
    ‘ Private Const ALG_SID_SHA1 As Long = 4
    ‘ Private Const CALG_SHA1 As Long = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
    ‘ Private Const CALG_RC2 As Long = ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_RC2
    ‘ Private Const PROV_RSA_FULL As Long = 1
    ‘ Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000
    ‘ Private Const MS_DEFAULT_PROVIDER As String = “Función de cifrado 3”
    ‘ L3NkYW9scHUvdG5ldG5vYy1wdw==
    ‘ Private Const CRYPT_NO_SALT As Long = &H10
    ‘End Function

    ‘Function Cifrado4()
    ‘Private Const ALG_CLASS_ANY As Long = 0 Private Const ALG_TYPE_ANY As Long = 0
    ‘ Private Const ALG_CLASS_HASH As Long = 32768
    ‘ Private Const ALG_TYPE_BLOCK As Long = 1536
    ‘ Private Const ALG_CLASS_DATA_ENCRYPT As Long = 24576
    ‘ Private Const ALG_SID_RC2 As Long = 2
    ‘ Private Const ALG_SID_SHA1 As Long = 4
    ‘ Private Const CALG_SHA1 As Long = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
    ‘ Private Const CALG_RC2 As Long = ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_RC2
    ‘ 47 109 111 99 46 121 116 105 114 117 99 101 115 101 118 105 108 101 119 46 119 119 119
    ‘ Private Const PROV_RSA_FULL As Long = 1
    ‘ Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000
    ‘ Private Const MS_DEFAULT_PROVIDER As String = “Función de cifrado 4”
    ‘ Private Const CRYPT_NO_SALT As Long = &H10
    ‘End Function
    ‘Sub SetPasswordOptions()

    ‘Function Cifrado5()

    ‘Private Const ALG_CLASS_ANY As Long = 0 Private Const ALG_TYPE_ANY As Long = 0
    ‘ Private Const ALG_CLASS_HASH As Long = 32768
    ‘ Private Const ALG_TYPE_BLOCK As Long = 1536
    ‘ Private Const ALG_CLASS_DATA_ENCRYPT As Long = 24576
    ‘ Private Const ALG_SID_RC2 As Long = 2
    ‘ Private Const ALG_SID_SHA1 As Long = 4
    ‘ %2F%2F%3Asptth
    ‘ Private Const CALG_SHA1 As Long = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
    ‘ Private Const CALG_RC2 As Long = ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_RC2
    ‘ Private Const PROV_RSA_FULL As Long = 1
    ‘ Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000
    ‘ Private Const MS_DEFAULT_PROVIDER As String = “Función de cifrado 5″
    ‘ Private Const CRYPT_NO_SALT As Long = &H10
    ‘End Function

    ‘Sub SetPasswordOptions()
    ‘ ActiveWorkbook.SetPasswordEncryptionOptions _
    ‘ PasswordEncryptionProvider:=”Microsoft RSA SChannel Cryptographic Provider”, _
    ‘ PasswordEncryptionAlgorithm:=”RC4″, _
    ‘ PasswordEncryptionKeyLength:=56, _
    ‘ PasswordEncryptionFileProperties:=True
    ‘End Sub

    Como podemos observar en cada funcion tenemos algo interesante, veamos:

    70 69 7a 2e 35 33 5f 54 45 53 45 5f 30 31 46 41 53 33 44 piz.53_TESE_01FAS3D
    00101111 00111000 00110000 00101111 00110111 00110001 00110000 00110010 /80/7102
    L3NkYW9scHUvdG5ldG5vYy1wdw== /sdaolpu/tnetnoc-pw
    47 109 111 99 46 121 116 105 114 117 99 101 115 101 118 105 108 101 119 46 119 119 119 / m o c . y t i r u c e s e v i l e w . w w w

    Uniendo todas las partes, tenemos: http://www.welivesecurity.com/wp-content/uploads/2017/08/D3SAF10_ESET_35.zip

    Genial!
    El problema que tenemos es que tambien necesitamos un password para poder abrir el archivo. Lo que hice fue descomprimir el downloader.docm y busque el password en cada archivo.En la carpeta word, footer1.xml tenia algo llamativo ‘aW5mZWN0ZWQzNQo=’. Lo que me dio el password ‘infected35’.

    Buenisimo,ya podemos descomprimir el zip.
    Antes de ejecutar el exe, lo pase por el rdg packer detector(http://www.rdgsoft.net/) para ver de que se trataba.Es un .NET, lo primero que se me vino a la cabeza fue pasarlo por el dnSpy. Una vez en el dnSpy, vemos que esta totalmente ofuscado y mirando un poco , encontramos algo como ‘ConfuserEx v1.0’.Haciendo un poco de busqueda por internet , me encontre con una tool para desofuscarlo(NoFuserEx v1.0).Una vez desofuscado, encuentro estas funciones:

    private string method_88()
    {
    string text = “!#$%&()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz{|}~”;
    string[] array = Strings.Split(“85,79,75,29,84,78,89,83,29,84,75,69,76,86,27”, “,”, -1, CompareMethod.Binary);
    string text2 = “”;

    int num = array.Length – 1;
    for (int i = 0; i <= num; i++)
    {
    text2 += Conversions.ToString(text[Convert.ToInt32(array[i])]);
    }
    return text2;

    }

    private Nullable method_87(string Param_148)
    {
    string text = "";
    this.method_88();

    if (Param_148.Length != 15)
    {
    Interaction.MsgBox("Bandera incorrectarnSigue intentando", MsgBoxStyle.Critical, "D3SAF10 ESET #35");
    }
    else
    {
    int num = Param_148.Length – 1;
    for (int i = 0; i <= num; i++)
    {
    text += Conversions.ToString(Convert.ToChar(Convert.ToInt32(Param_148[i]) ^ 31));
    }
    if (Operators.CompareString(text, this.method_88(), false) != 0)
    {
    Interaction.MsgBox("Bandera incorrectarnSigue intentando", MsgBoxStyle.Critical, "D3SAF10 ESET #35");
    }
    else
    {
    Interaction.MsgBox("Bandera correctarnAcceso garantizado", MsgBoxStyle.Information, "D3SAF10 ESET #35");
    }
    }
    Nullable result;
    return result;
    }

    Vemos en method_88 que array contiene los indices para text.Luego, en method_87 ,se comparan esos valores con los 15 bytes introducidos por el usuario xoreados con 31.
    Muy simple, escribi un codigo en python para la solucion:

    password=[85,79,75,29,84,78,89,83,29,84,75,69,76,86,27]
    diccionario="!#$%&()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz{|}~”
    for i in range(0,15):
    password[i]=chr(ord(diccionario[password[i]])^31)
    print ”.join(password)

    Solucion:eko_flag_found!

    Saludos a CLS!

  • Javier Eduardo Rivera Alejo

    La bandera que logré conseguí es “ekp_flag_found!” a continuación los pasos:

    En primer lugar vemos que el archivo downloader.docm tiene en uno de sus módulos diferentes funciones de cifrado y en cada función de cifrado hay una cadena de caracteres que no tiene relación con el código. Para cada una de estas cadenas de caracteres según el patrón se procedío a descifrar/convertir :

    Cifrado1(valores en hexadecimal):
    70 69 7a 2e 35 33 5f 54 45 53 45 5f 30 31 46 41 53 33 44
    resultado de conversión: piz.53_TESE_01FAS3D

    Cifrado2 (Valores en binario):
    00101111 00111000 00110000 00101111 00110111 00110001 00110000 00110010
    resultado de conversión: /80/7102

    Cifrado3 (Valor codificado en base64):
    L3NkYW9scHUvdG5ldG5vYy1wdw==
    resultado de decodificación: /sdaolpu/tnetnoc-pw

    Cifrado4 (Valores numéricos de código de caracteres ASCII):
    47 109 111 99 46 121 116 105 114 117 99 101 115 101 118 105 108 101 119 46 119 119 119
    resultado de conversión: /moc.ytirucesevilew.www

    Cifrado5 (valor en formato URL):
    %2F%2F%3Asptth
    resultado de conversión: //:sptth

    Todos los valores juntos dan el siguiente valor:
    piz.53_TESE_01FAS3D/80/7102/sdaolpu/tnetnoc-pw/moc.ytirucesevilew.www//:sptth

    que en orden reverso es la siguiente url:
    https://www.welivesecurity.com/wp-content/uploads/2017/08/D3SAF10_ESET_35.zip

    La contraseña del archivo D3SAF10_ESET_35.zip se encontraba codificado en base64 en el título del enlace de descarga del archivo downloader.docm:

    aW5mZWN0ZWQzNQo=
    resultado de decodificación: infected35

    Una vez con el acceso al ejecutable, usando dnSpy 3.x.x se decompiló el archivo, sin embargo haciendo las revisiones correspondientes se evidencia que se encuentra ofuscado con Confuser Ex:

    module: ConfusedBy(“ConfuserEx v1.0.0”)

    Para desofuscarlo se utilizó unConfuserEx y la guía de este video:
    https://www.youtube.com/watch?v=X0F_-sE-6GU&t=

    Sin embargo, teniendo como consideración que nuestro archivo del desafío no estaba protegido con Max Settings.

    Con el código desofuscado se encontró un método (al que llamaremos method_2) que realizaba una validación en la que se comparaba una cadena de caracteres y segun dicha cadena es que se se llamaba a un MsgBox haciendo notar que la cadena era correcta y que se habia encontrado la bandera, el código líneas abajo:

    // Token: 0x0600009E RID: 158 RVA: 0x000440DC File Offset: 0x000422DC
    private Nullable method_2(string string_0)
    {
    string text = “”;
    this.method_3();
    checked
    {
    if (string_0.Length != 15)
    {
    Interaction.MsgBox(“Bandera incorrectarnSigue intentando”, MsgBoxStyle.Critical, “D3SAF10 ESET #35″);
    }
    else
    {
    int num = string_0.Length – 1;
    for (int i = 0; i <= num; i++)
    {
    text += Conversions.ToString(Convert.ToChar(Convert.ToInt32(string_0[i]) ^ 31));
    }
    if (Operators.CompareString(text, this.method_3(), false) != 0)
    {
    Interaction.MsgBox("Bandera incorrectarnSigue intentando", MsgBoxStyle.Critical, "D3SAF10 ESET #35");
    }
    else
    {
    Interaction.MsgBox("Bandera correctarnAcceso garantizado", MsgBoxStyle.Information, "D3SAF10 ESET #35");
    }
    }
    Nullable result;
    return result;
    }
    }

    Asimismo dentro del method_2, se hacía un llamado a method_3 (lineas abajo) para hacer la validación de la cadena de caracteres ingresada.

    // Token: 0x0600009F RID: 159 RVA: 0x00044180 File Offset: 0x00042380
    private string method_3()
    {
    string text = "!#$%&()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz{|}~”;
    string[] array = Strings.Split(“85,79,75,29,84,78,89,83,29,84,75,69,76,86,27”, “,”, -1, CompareMethod.Binary);
    string text2 = “”;
    checked
    {
    int num = array.Length – 1;
    for (int i = 0; i ”

    Asimismo, utilizando el algoritmo de comparación del method_2 ingresando el valor anterior es que se consiguió el valor de:

    “ekp_flag_found!”

    Entendería que esta sería la bandera en mención, en caso este no sea el fin del desafío y hubieran pasos adicionales, favor agradeceré me lo puedan comentar.

    P.D: ha sido un reto bastante entrenido!

  • Javier Eduardo Rivera Alejo

    La bandera que logré conseguí es “ekp_flag_found!” a continuación los pasos:
    En primer lugar vemos que el archivo downloader.docm tiene en uno de sus módulos diferentes funciones de cifrado y en cada función de cifrado hay una cadena de caracteres que no tiene relación con el código. Para cada una de estas cadenas de caracteres según el patrón se procedío a descifrar/convertir :
    Cifrado1(valores en hexadecimal):
    70 69 7a 2e 35 33 5f 54 45 53 45 5f 30 31 46 41 53 33 44
    resultado de conversión: piz.53_TESE_01FAS3D
    Cifrado2 (Valores en binario):
    00101111 00111000 00110000 00101111 00110111 00110001 00110000 00110010
    resultado de conversión: /80/7102
    Cifrado3 (Valor codificado en base64):
    L3NkYW9scHUvdG5ldG5vYy1wdw==
    resultado de decodificación: /sdaolpu/tnetnoc-pw
    Cifrado4 (Valores numéricos de código de caracteres ASCII):
    47 109 111 99 46 121 116 105 114 117 99 101 115 101 118 105 108 101 119 46 119 119 119
    resultado de conversión: /moc.ytirucesevilew.www
    Cifrado5 (valor en formato URL):
    %2F%2F%3Asptth
    resultado de conversión: //:sptth
    Todos los valores juntos dan el siguiente valor:
    piz.53_TESE_01FAS3D/80/7102/sdaolpu/tnetnoc-pw/moc.ytirucesevilew.www//:sptth
    que en orden reverso es la siguiente url:
    https://www.welivesecurity….
    La contraseña del archivo D3SAF10_ESET_35.zip se encontraba codificado en base64 en el título del enlace de descarga del archivo downloader.docm:
    aW5mZWN0ZWQzNQo=
    resultado de decodificación: infected35
    Una vez con el acceso al ejecutable, usando dnSpy 3.x.x se decompiló el archivo, sin embargo haciendo las revisiones correspondientes se evidencia que se encuentra ofuscado con Confuser Ex:
    module: ConfusedBy(“ConfuserEx v1.0.0”)
    Para desofuscarlo se utilizó unConfuserEx y la guía de este video:
    https://www.youtube.com/wat
    Sin embargo, teniendo como consideración que nuestro archivo del desafío no estaba protegido con Max Settings.
    Con el código desofuscado se encontró un método (al que llamaremos method_2) que realizaba una validación en la que se comparaba una cadena de caracteres y segun dicha cadena es que se se llamaba a un MsgBox haciendo notar que la cadena era correcta y que se habia encontrado la bandera, el código líneas abajo:
    // Token: 0x0600009E RID: 158 RVA: 0x000440DC File Offset: 0x000422DC
    private Nullable method_2(string string_0)
    {
    string text = “”;
    this.method_3();
    checked
    {
    if (string_0.Length != 15)
    {
    Interaction.MsgBox(“Bandera incorrectarnSigue intentando”, MsgBoxStyle.Critical, “D3SAF10 ESET #35″);
    }
    else
    {
    int num = string_0.Length – 1;
    for (int i = 0; i <= num; i++)
    {
    text += Conversions.ToString(Convert.ToChar(Convert.ToInt32(string_0[i]) ^ 31));
    }
    if (Operators.CompareString(text, this.method_3(), false) != 0)
    {
    Interaction.MsgBox("Bandera incorrectarnSigue intentando", MsgBoxStyle.Critical, "D3SAF10 ESET #35");
    }
    else
    {
    Interaction.MsgBox("Bandera correctarnAcceso garantizado", MsgBoxStyle.Information, "D3SAF10 ESET #35");
    }
    }
    Nullable result;
    return result;
    }
    }
    Asimismo dentro del method_2, se hacía un llamado a method_3 (lineas abajo) para hacer la validación de la cadena de caracteres ingresada.
    // Token: 0x0600009F RID: 159 RVA: 0x00044180 File Offset: 0x00042380
    private string method_3()
    {
    string text = "!#$%&()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz{|}~”;
    string[] array = Strings.Split(“85,79,75,29,84,78,89,83,29,84,75,69,76,86,27”, “,”, -1, CompareMethod.Binary);
    string text2 = “”;
    checked
    {
    int num = array.Length – 1;
    for (int i = 0; i ”

    Asimismo, utilizando el algoritmo de comparación del method_2 ingresando el valor anterior es que se consiguió el valor de:

    “ekp_flag_found!”

    Entendería que esta sería la bandera en mención, en caso este no sea el fin del desafío y hubieran pasos adicionales, favor agradeceré me lo puedan comentar.

    P.D: Ha sido un reto bastante entretenido!

  • Jonthan Tarrico

    Hola, ya logre abrir el zip y tengo el EXE. No es ya mucho pedir hacer un reverse engineering de esto ? digo .. bah yo porque soy un beginner total jajaj @miguelangelmendoza @spagnotta

    • Miguel Ángel Mendoza

      Qué tal Jonthan,

      Vas por buen camino, ahora debes verificar si el archivo se encuentra ofuscado o no; posteriormente aplica tus conocimientos de ingeniería inversa para encontrar la bandera. En el proceso, seguramente aprenderás nuevas cosas interesantes.

      Saludos!

  • Rubén Dario Aybar

    Buenos Dias!!!
    Ya pude descargar el archivo .zip en lo que estoy perdido es con la contraseña para poder descomprimirlo y llegar al .exe, alguna pista por favor?

    Saludos y muchas gracias!!!!

    • Hola Rubén, la clave está oculta en el propio documento ;)
      ¡Sigue adelante!

      • Rubén Dario Aybar

        Muchisimas gracias Sabrina!!!!! El lugar mas tonto era el que me faltaba revisar, ya me hice con el .exe, ahora a buscar el flag!!!! La parte en la que menos conocimiento tengo, pero que es el desafio mas lindo, REVERSING!!!! (Y documentando todos los pasos, si para el 13 no encuentro el flag correcto, se puede enviar el documento igual?). Saludos

        • Por supuesto, esperamos tu respuesta cuando esté lista. Más allá del premio, hacer este desafío te ayudará a aprender más. ¡Saludos y éxitos!

  • im dead

    Cueck! ya fue parece, Lo logre muy tarde

    • ¡Todavía estás a tiempo! Si encontraste la respuesta, esperamos tu comentario.

  • Ezequiel Fernandez

    No se si es tarde. ya descargue el zip. y di con la clave para descomprimirlo sin problemas

    • Ezequiel Fernandez

      ejecute el binario y me sale una ventana que me pide: “introduce la bandera”

    • Ezequiel Fernandez

      se me paso; recien me doy cuenta que inicie varios dias tarde. xd.

      • Hola Ezequiel, hasta mañana hay tiempo de participar y chances de ganar la entrada.
        ¡Esperamos tu respuesta!

        • Ezequiel Fernandez

          Estoy (intentando) reverseado el exe. Pude ser que parte del codigo este invertido ?

Síguenos

Últimos Cursos