By Mexihacks Team
Descripcion:
Recuerdo que la materia de Ensamblador en la universidad soliamos llamarla Ensartador, espero este reto no sea algo similar.
Existe una funcion matematica, implementala y arrojara un numero el cual sera la flag.
Resolucion:
1. El archivo que nos dan es de tipo ASCII.
2. Al abrir el código anterior se observa un ascii art rifado, referente al logo anterior del HackDef:
2.1 Al abrir el código anterior se observa que el código embebido es de tipo MIPS.
3. Ejecutamos el código anterior con el entorno llamado spim.
Tiene errores de sintaxis, corregimos la sintaxis, al eliminar el encabezado de abajo:
4. Guardamos cambios.
5. Ejecutamos la nueva versión del programa.
Al parecer ya no tiene errores de sintaxis, pero no termina, pareciera caer en un ciclo infinito.
6. Cuando se revisó su código fuente, se visualizó que es la implementación clásica del algoritmo recursivo de Fibonacci, los siguientes son los valores de inicio:
El código referente a la función recursiva del algoritmo es el siguiente:
Al ser recursivo, su tiempo de ejecución es mayor que en su versión iterativa, fue por eso que al ejecutarlo el programa parecer caer en un ciclo infinito, sin embargo, esto no es así.
Si se presta atención a las siguientes líneas de código:
La instruccion mfhi mueve el resultado de la division a $v0, aunque no es recomendable ese orden de instrucciones en arquitectura MIPS, el emulador SPIM no se queja al respecto :-)
Es notorio que el algoritmo tiene una pequeña modificación en el resultado que retorna, en pseudocódigo tenemos que las líneas anteriores corresponden a hacer las siguientes operaciones:
Al resultado de cada recursividad de la función llamada bif se le aplica un módulo igual a t2, t2 corresponde al valor constante de 20191337.
7. Dicho lo anterior, se programó el siguiente script que implementa la función de Fibonacci, pero en su forma iterativa, para tener una ejecución más rápida comparada con su versión recursiva, pero se le hizo la modificación considerando la operación del módulo.
8. Ejecutar el script anterior, se obtiene la flag!!!!!!!!
Descripcion:
Recuerdo que la materia de Ensamblador en la universidad soliamos llamarla Ensartador, espero este reto no sea algo similar.
Existe una funcion matematica, implementala y arrojara un numero el cual sera la flag.
Resolucion:
1. El archivo que nos dan es de tipo ASCII.
user@blackbox:~/Hackdef/RE/3. Ensartador$ file Ensartador.asm
Ensartador.asm: ASCII text
user@blackbox:~/Hackdef/RE/3. Ensartador$
2. Al abrir el código anterior se observa un ascii art rifado, referente al logo anterior del HackDef:
2.1 Al abrir el código anterior se observa que el código embebido es de tipo MIPS.
# Can U reverse it? # R U a h4ck3r or n00b5? [snipped] .text .globl main main: la $a0, eid_in li $v0, 4 syscall la $a0, new_eid li $v0, 4 syscall [snipped] .data eid_in: .asciiz "run program! LOL ..." eid_out: .asciiz "HAPPY EID: flag{" eid_end: .asciiz "}" eid_num: .word 200 leet_eid: .word 20191337 new_eid: .asciiz "\n"
3. Ejecutamos el código anterior con el entorno llamado spim.
user@blackbox:~/Hackdef/RE/3. Ensartador$ spim -f Ensartador.asm SPIM Version 8.0 of January 8, 2010 Copyright 1990-2010, James R. Larus. All Rights Reserved. See the file README for a full copyright notice. Loaded: /usr/lib/spim/exceptions.s spim: (parser) syntax error on line 8 of file Ensartador.asm .,, ^ The following symbols are undefined: main Instruction references undefined symbol at 0x00400014 [0x00400014] 0x0c000000 jal 0x00000000 [main] ; 188: jal main user@blackbox:~/Hackdef/RE/3. Ensartador$
Tiene errores de sintaxis, corregimos la sintaxis, al eliminar el encabezado de abajo:
# Can U reverse it? # R U a h4ck3r or n00b5? # Y0u kn0w i'm alw4ys h4ppy exc3pt 0n3 d4y, 1t w4s l4st y34r wh3n s0m30n3 f0und my fl4g! # This year you w1ll n3v3r g3t my flag ... but y0u c4n g3t it despues que termine el CTF! [snipped] **,*,,**,/,.*, .*,...,*....,,,*,.*/,**... ,, .*, ./,**... .*,*..*,,*,...**.,*. ...,*,*,.**,*,**,,* **,*,,**,*/**, ... .*,,,.,*,,,.,,.**,//,**,,. .,, .**,*/,**,,, */* *,,, ** .*. .. .,,,*,*. **,*,**,** **,*, ,*,**, ./// .*. .*,,,.**/**,** *//. .**/**,** ***. *,,,. ** .*. .*// .** .*. **.*,*,.,*
4. Guardamos cambios.
5. Ejecutamos la nueva versión del programa.
user@blackbox:~/Hackdef/RE/3. Ensartador$ spim -f 2_Ensartador.asm SPIM Version 8.0 of January 8, 2010 Copyright 1990-2010, James R. Larus. All Rights Reserved. See the file README for a full copyright notice. Loaded: /usr/lib/spim/exceptions.s run program! LOL ...
Al parecer ya no tiene errores de sintaxis, pero no termina, pareciera caer en un ciclo infinito.
6. Cuando se revisó su código fuente, se visualizó que es la implementación clásica del algoritmo recursivo de Fibonacci, los siguientes son los valores de inicio:
eid_in: .asciiz "run program! LOL ..." eid_out: .asciiz "HAPPY EID: flag{" eid_end: .asciiz "}" eid_num: .word 200 leet_eid: .word 20191337 new_eid: .asciiz "\n"
El código referente a la función recursiva del algoritmo es el siguiente:
bif: addi $sp, $sp, -12 sw $ra, 0($sp) sw $s0, 4($sp) sw $s1, 8($sp) add $s0, $a0, $zero addi $t1, $zero, 1 beq $s0, $zero, return0 beq $s0, $t1, return1 addi $a0, $s0, -1 jal bif add $s1, $zero, $v0 addi $a0, $s0, -2 jal bif lw $a0, leet_eid move $t2, $a0 div $v0, $t2 mfhi $v0 add $v0, $v0, $s1 # final value is return value from n-2 recursion of fibonacci... exitbif: lw $ra, 0($sp) lw $s0, 4($sp) lw $s1, 8($sp) addi $sp, $sp, 12 jr $ra return1: li $v0,1 j exitbif return0: li $v0,0 j exitbif
Al ser recursivo, su tiempo de ejecución es mayor que en su versión iterativa, fue por eso que al ejecutarlo el programa parecer caer en un ciclo infinito, sin embargo, esto no es así.
Si se presta atención a las siguientes líneas de código:
lw $a0, leet_eid move $t2, $a0 div $v0, $t2 mfhi $v0
La instruccion mfhi mueve el resultado de la division a $v0, aunque no es recomendable ese orden de instrucciones en arquitectura MIPS, el emulador SPIM no se queja al respecto :-)
Es notorio que el algoritmo tiene una pequeña modificación en el resultado que retorna, en pseudocódigo tenemos que las líneas anteriores corresponden a hacer las siguientes operaciones:
v0 = bif(s0 - 1); s1 = v0; v0 = bif(s0 - 2); t2 = 20191337; v0 = v0 % t2; v0 = v0 + s1; return v0;
Al resultado de cada recursividad de la función llamada bif se le aplica un módulo igual a t2, t2 corresponde al valor constante de 20191337.
7. Dicho lo anterior, se programó el siguiente script que implementa la función de Fibonacci, pero en su forma iterativa, para tener una ejecución más rápida comparada con su versión recursiva, pero se le hizo la modificación considerando la operación del módulo.
def f(n): a, b = 0, 1 for i in range(0, n): a, b = b, a%20191337 + b return a n = 200 print(f(n))
8. Ejecutar el script anterior, se obtiene la flag!!!!!!!!
user@blackbox:~/Hackdef/RE/3. Ensartador$ python3 fib.py 1675618669 user@blackbox:~/Hackdef/RE/3. Ensartador$
Comments
Post a Comment