Documente Academic
Documente Profesional
Documente Cultură
Con la nueva release del firmware de Kitt cambió el sistema de desbloqueo. Después de
unos cuantos intentos fallidos el sistema se ha bloqueado y necesitamos introducir un
código de seguridad. Lamentablemente, el becario que desarrolló el firmware está de de
baja porque se rompió el radio y no coge el teléfono. Debes encontrar la forma de generar
un código válido.
http://34.253.120.147:31337
Resolución
Abrimos la página.
=====================================================
Gobuster v2.0.1 OJ Reeves (@TheColonial)
=====================================================
[+] Mode : dir
[+] Url/Domain : http://34.253.120.147:31337/
[+] Threads : 10
[+] Wordlist : /usr/share/wordlists/dirb/common.txt
[+] Status codes : 200,204,301,302,307,403
[+] Expanded : true
[+] Timeout : 10s
=====================================================
2020/01/15 13:09:11 Starting gobuster
=====================================================
http://34.253.120.147:31337/flag (Status: 200)
http://34.253.120.147:31337/seccode (Status: 302)
=====================================================
2020/01/15 13:10:14 Finished
=====================================================
UAM{aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1mc3hWbzZXcUk4dw==}
base64
UAM{https://www.youtube.com/watch?v=fsxVo6WqI8w}
seccode: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked,
interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32,
BuildID[sha1]=7dae0b820e98b8d7a7b4299af23de7523953fe29, not stripped
Probamos:
root@kali:~/Desktop# ./seccode
Invalid key.
Tendremos que buscar la key correcta. Abrimos con Ghidra y decompilamos “main”
{
char *__s;
char cVar1;
int iVar2;
int iVar3;
undefined8 uVar4;
size_t sVar5;
uint uVar6;
long in_FS_OFFSET;
uint local_60;
int local_5c;
int local_58;
code *local_50;
byte abStack40 [8];
long local_20;
Incorrect key :(
while( true ) {
sVar5 = strlen(__s);
if (sVar5 <= (ulong)(long)(int)local_60) break;
iVar2 = (int)local_60 / 2;
iVar3 = tolower((int)__s[(int)local_60]);
cVar1 = (char)iVar3;
if ((cVar1 < '0') || ('8' < cVar1)) {
local_5c = (int)cVar1 + -0x57;
}
else {
local_5c = (int)cVar1 + -0x30;
}
if ((local_60 & 1) == 0) {
abStack40[iVar2] = abStack40[iVar2] & 0xf;
abStack40[iVar2] = abStack40[iVar2] | (byte)(local_5c << 4);
}
else {
abStack40[iVar2] = abStack40[iVar2] & 0xf0;
abStack40[iVar2] = abStack40[iVar2] | (byte)local_5c & 0xf;
}
local_60 = local_60 + 1;
}
Esta parte de código está localizada en 00402187-00402269.
Para 11111111:
Para AB112233:
abStack40 -> es la zona de memoria donde se coloca el valor del string, parámetro key.
Lo que realiza es un xor de key introducida con los valores 0x403000 - 0x40333a
Posteriormente:
Luego, compara la dirección de memoria 0x40300d tras el XOR realizado con la key de
entrada contra la string “UAM”. Para solucionarlo tenemos que:
0040300d 64 ?? 64h d
0040300e 76 ?? 76h v
0040300f 7a ?? 7Ah z
00403010 4b ?? 4Bh K
004033fc 55 ?? 55h U
004033fd 41 ?? 41h A
004033fe 4d ?? 4Dh M
004033ff 00 ?? 00h
Incorrect key :(
Algo no va del todo bien, revisamos, volcamos en hexadecimal, la zona de memoria de
(00403000-00403339) y realizamos el XOR en CyberChef, comprobamos que el error se
produce por el desplazamiento al realizar el XOR. Al empezar en 403000, cuando llega a la
dirección 0040300d, la key no se aplica como necesitamos (4 caracteres 3137374b):
1e 79 be d2 03 b2 db 57 03 b8 4a 9f 7e 64 76 7a 4b
iVar2 = strcmp(&DAT_0040300d,"UAM"); /
if (iVar2 == 0) {
uVar4 = FUN_00403000();
printf("Codigo: %lu\n",uVar4);
}
Lo que realiza es una llamada a 403000, es decir, una vez realizado el xor y la key es
correcta, interpreta la zona de memoria como opcodes, pasando a ser de zona de
ejecución.
En edb, podemos ver como queda el código, si ejecutamos paso a paso, otro detalle a tener
en cuenta, sobreescribe la zona de ejecución con nop, borrando algunas instrucciones (xor).
Para poder analizar el código, podemos utilizar Ghidra, que incorpora un decompilador muy
bueno. Para ello, utilizamos un editor hexadecimal de ficheros, y sustituimos la parte
correspondiente al volcado de memoria (00403000-00403339) por los valores después del
XOR, teniendo en cuenta en la sustitución del volcado de memoria los valores de las
imágenes anteriores (nop). Después abrimos en Ghidra y en esas direcciones ya aparece el
pseudocódigo en C.
ulong FUN_00403000(ulong param_1)
{
ulong uVar1;
time_t tVar2;
time_t tVar3;
ulong uVar4;
float fVar5;
float fVar6;
ulong local_60;
ulong local_48;
ulong local_40;
ulong local_38;
ulong local_30;
Resumiendo utiliza la el parámetro “seed” c omo límite para ir generando los términos de
una serie, y da como resultado el último término, ( “capado” -> mod 100000). Las otras
variables, sólo se utilizan para ir dando el porcentaje del proceso y una estimación del
tiempo.
Serie:
https://www.geeksforgeeks.org/matrix-exponentiation/
Para la serie:
La misma página nos da un pequeño programa de ejemplo, que podemos utilizar como
base, modificamos para ajustarlo a este caso concreto y añadiendo el cálculo modular,
utilizando las propiedades indicadas en:
https://stackoverflow.com/a/26284607/1756928
or a matrix M. This comes from the following two fundamental identities, which are
valid for integers x and y:
(x+y) mod p = ([x mod p]+[y mod p]) mod p # All additions can be done on
numbers *modulo p*
(x*y) mod p = ([x mod p]*[y mod p]) mod p # All multiplications can be done
on numbers *modulo p*
def findNthTerm(n):
F = [[6, 4, 0], [1, 0, 0], [0, 1, 0]];
return power(F, n - 2);
# Driver code
n = 284885361295; #Seed, código desbloqueo indicado en la web
x = findNthTerm(n+2); #desplazamiento del término n para ajustarlo a seccode
print("F("+str(n)+") is", x);
print("F("+str(n)+") is", x % 100000);
Probamos en https://repl.it/languages/python3
Aquí, hay que comentar que para comprobar funcionaba correctamente, se probaron con
los valores obtenidos en seccode y el script en python, descubriendo que el programa nos
devolvía dos términos por delante de la semilla n introducida.
Python3:
F(65536) is 35986092
F(65536) is 86092
F(65537) is 167480131
F(65537) is 80131
F(65538) is 181621905
F(65538) is 21905
F(209717987314) is 19826609
F(209717987314) is 26609
Correcto!
Esta es tu flag: UAM{b4f2741f6f27497193288faf2cf70399}
UAM{b4f2741f6f27497193288faf2cf70399}
Found : julianwashere
@bicacaro