PRÁCTICA-INVERSA-JarvisOJ-3
Subir las escaleras
apk, colóquelo en el simulador y ejecútelo.
Se puede presionar el botón "Subir un piso". Cada vez que haga clic en, "Piso escalado" más 1 piso. El
botón "Subir para ver la BANDERA" no se puede presionar, debería ser " Subido "Cuando" piso "es igual a" piso para subir ", se puede presionar el botón para que se
abra el indicador jadx-gui. En com.ctf.test.ctf_100.MainActivity, la
lógica principal de la biblioteca ctf es estáticamente cargado . En el método onCreate, se quiere subir el suelo se establece como un número aleatorio. Cuando el suelo que ha sido escalada es mayor o igual que el piso para ser subido, se puede conseguir la bandera pulsando el botón de la bandera
. Al comienzo del programa de la bandera, configure el botón de la bandera para que no se pueda presionar , y configúrelo como presionable después de que se cumplan las condiciones. Considere el programa de parche, Deje que el botón para ver la bandera al comienzo del programa se configure para que se pueda
presionar .Abra el apk con jeb para encontrar el código ensamblador correspondiente a la declaración de java.
Puede ver que al comienzo del método onCreate, v5 es 0, como en Button-> setClickable debajo del parámetro, configure el botón de la bandera del reloj para que no sea Cuando v5patch se establece en 1, el botón de la bandera del reloj está configurado para
poder presionar ApkToolBox para descompilar el apk al principio , abra CFF_100 \ smali \ com \ ctf \ test \ ctf_100 \ MainActivity smali, busque la ubicación correspondiente, modificar y guardar,
arrastre toda la carpeta CFF_100 a ApkToolBox y vuelva a compilar, obtenga una nueva apk
para ejecutar en el emulador, puede ver, puede hacer clic en el botón de la bandera para obtener la bandera directamente
Craqueo de contraseña de software-1
Para un programa MFC de 32 bits, primero use xspy para verificar la identificación del botón "Aceptar", que es 0001
y luego verifique toda la ventana, sabiendo que la función de respuesta correspondiente al botón "Aceptar" es (0x0040) 1BB0.
Abra el programa MFC y busque 1BB0 en la ventana de la función de la izquierda. Al llegar al
análisis de la función sub_401BB0 , podemos ver que la entrada y la matriz byte_5777F8 están XORed en el orden del índice, y el resultado se compara con el conocido Se verifica que
los elementos de la matriz byte_5777F8 de entrada no se pueden obtener en el análisis estático, y se requiere el programa adjunto para depurar y
escribir XOR inverso. Calcular el script para obtener la bandera
res=[0x1B, 0x1C, 0x17, 0x46,
0xF4, 0xFD, 0x20, 0x30,
0xB7, 0x0C, 0x8E, 0x7E,
0x78,0xDE]
byte_5777F8=[0x28, 0x57, 0x64, 0x6B, 0x93, 0x8F, 0x65, 0x51, 0xE3, 0x53,
0xE4, 0x4E, 0x1A, 0xFF]
flag=""
for i in range(len(res)):
flag+=chr(res[i]^byte_5777F8[i])
print(flag)
#3Ks-grEaT_j0b!
Clásico CrackMe2
exe, ingrese la contraseña e imprima una cadena de base64 para
verificar el shell cuando la contraseña se ingresa incorrectamente.Se encuentra que es un programa .Net, y hay una oración "no desempaquetar con: de4dot". No use de4dot para descomprimir.
Use de4dot para descomprimir, pero descomprima después de que el programa no se ejecute,
dnSpy abra el programa original, porque no hay descomprimido, habrá algunos caracteres que no entienden el significado, luego puede abrir otro dnSpy abrir desempaquetar antes, en el punto de vista
brillante en el brillo y vi que presionar Después del botón "GETFLAG", venga a este lugar para juzgar que
se ingresa texto, y text2 es el contenido devuelto después de
pasar el texto ingresado a un método de "Wm @@ 9OrPgw \ u0020d / p? i, N> l h @ Y!", Y luego juzgue si el texto está vacío y si text2 es el mismo que el conocido. Observe el método llamado "Wm @@ 9OrPgw \ u0020d / p? i, N> l h @ Y! ", y descubrió que los parámetros entrantes Cifrado en modo AES.ECB, la matriz denominada bytes se utiliza como clave de cifrado Clave, y el texto cifrado se codifica con base64 y luego Después de la
depuración, puede saber que la clave de cifrado La clave es "pctf2016pctf2016pctf2016pctf2016"
text2 La cadena que se va a comparar es "x / nzolo0TTIyrEISd4AP1spCzlhSWJXeNbY81SjPgmk ="
Escriba el script AES para obtener la bandera
from Crypto.Cipher import AES
import base64
key="pctf2016pctf2016pctf2016pctf2016"
cipher="x/nzolo0TTIyrEISd4AP1spCzlhSWJXeNbY81SjPgmk="
cipher=base64.b64decode(cipher)
aes=AES.new(key,AES.MODE_ECB)
print(aes.decrypt(cipher))
#PCTF{Dot_Net_UnPack3r_yoo}
Smali
Archivo .smali, abrir jadx-jui La
lógica principal es usar la clave conocida y el texto cifrado para descifrar el AES en modo ECB y
escribir el script AES descifrado para obtener la bandera
from Crypto.Cipher import AES
import base64
key="cGhyYWNrICBjdGYgMjAxNg=="
key=base64.b64decode(key)
cipher="sSNnx1UKbYrA1+MOrdtDTA=="
cipher=base64.b64decode(cipher)
aes=AES.new(key,AES.MODE_ECB)
print(aes.decrypt(cipher))
#PCTF{Sm4liRiver}