Tengo un gran desafío en la mano
A continuación, resolví LuksCrypto en Linux, puedo montar el volumen protegido, he descompilado código con éxito.
Pero en la descompilación es de ELF binario para C, y no entiendo mucho C.
Necesito encontrar rutina cifra descifra un contenido de dongle rockey4nd.
FF 02 30 E4 56 9A 8A DF F1 0F 6B 9D A8 16 F7 3B 3B DD 7C 88 E9 3A 86 7E 06 EF E3 CE
C2 4E 0A 5C 1B 1A EF 1E C6 3A 45 86 54 F8 8D AC 4A 19 D3 D8 C3 8C 00 00 00 00 00 00 00
The AES key was encrypted
en vez de
256 bits:
Sal = 263BC60258FF4876
Chave = B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF
Iv = 7E892875A52C59A3B588306B13C31FBD
esta .
'$jhksdvjsfoiut9085-0t598gdsfgipoei-0fgb9dfk;l-hk0dgkhrlthkry;hyhk'
'pokhprooh,q$',0Ah,0
'$welkgptrgoee-09kglsgm,ogisdg09rltgk-s0df9hrdskgj09dfgdsfuihg09et'
';ldfkbdd$',0Ah,0
Encontré una región muy sospechosa.
Parece estar leyendo un archivo, y usando el cifrado.
¿Sera justamente la memoria dongle?
¿Algún amigo me da una idea?
i
Código
nt32_t function_8048c80(int32_t path, int32_t a2, void (**a3)(int32_t)) { char * exec_argv[1]; // 0x8049002 char * envp[1]; // 0x8049002 int32_t v1; char v2 = v1; // bp-224 int32_t v3 = *(int32_t *)20; // 0x8048ca4 int32_t result; // 0x804906e if (path == 0) { // 0x8049030 // branch -> 0x804900a // 0x804900a if (*(int32_t *)20 == v3) { // 0x804901a return -1; } // 0x8049056 __stack_chk_fail(); // branch -> 0x804905b // 0x804905b usleep(10); result = shm_unlink((char *)&g30); _exit(0); return result; } // 0x8048cbe signal(SIGINT, (void (**)(int32_t))function_8048c60); signal(SIGTERM, (void (**)(int32_t))function_8048c60); signal(SIGKILL, (void (**)(int32_t))function_8048c60); signal(SIGQUIT, (void (**)(int32_t))function_8048c60); signal(SIGSTOP, 0x8048c30); int32_t fd = open((char *)path, O_RDONLY); g2 = fd; if (fd >= 0) { // 0x8048d3c int32_t v4; __fxstat(3, fd, (struct stat *)&v4); uint32_t v5; if (v5 >= 29) { // 0x8048d61 g3 = &v2; lseek(g2, v5 - 29, SEEK_SET); if (read(g2, (char *)g3, 29) == 29) { // 0x8048d9c if (function_8048b90((char *)g3, 0) == 0) { // 0x8048db4 if (v2 == 1) { int32_t v6 = -0x5050506; int32_t offset; lseek(g2, offset, SEEK_SET); int32_t buf = 0; if (read(g2, (char *)&buf, 4) == 4) { int32_t v7 = &v6; // ebx int32_t v8; int32_t v9 = &v8; // 0x8048e69_0 srandom(buf); *(char *)v7 = (char)random(); int32_t v10 = v7 + 1; // 0x8048e7f v7 = v10; // branch -> 0x8048e78 while (v10 != v9) { // 0x8048e78 *(char *)v7 = (char)random(); v10 = v7 + 1; v7 = v10; // continue -> 0x8048e78 } int32_t v11 = random(); // 0x8048e86 __sprintf_chk((char *)&g30, 1, 32, "ep-%ud", v11); uint32_t fd2 = shm_open((char *)&g30, 578, S_IRWXU); // 0x8048eca if (fd2 >= 0) { // 0x8048edb int32_t offset2; int32_t v12 = g7 - offset2; // 0x8048edb v7 = v12 - 29; if (ftruncate(fd2, v12 + 3) < 0) { // 0x8049030 // branch -> 0x804900a // 0x804900a if (*(int32_t *)20 == v3) { // 0x804901a return -1; } // 0x8049056 __stack_chk_fail(); // branch -> 0x804905b // 0x804905b usleep(10); result = shm_unlink((char *)&g30); _exit(0); return result; } // 0x8048f00 lseek(g2, offset2, SEEK_SET); int32_t v13 = v7; // 0x8048f25 if (v7 < 0) { // if_8048f20_0_true v13 = v12 - 14; // branch -> after_if_8048f20_0 } // after_if_8048f20_0 g7 = 0; g3 = v9; int32_t fd3; // 0x8048fd6 int32_t v14; // 0x8048fdf int32_t result2; // 0x8049024_2 int32_t v15; if (v13 < 16) { // 0x8048fab close(g2); close(fd2); fd3 = shm_open((char *)&g30, O_RDONLY, S_IRWXU); v14 = vfork(); if (v14 < 0) { // 0x8049037 close(fd3); shm_unlink((char *)&g30); result2 = -1; // branch -> 0x804900a } else { // 0x8048fe9 if (v14 == 0) { // 0x804905b usleep(10); result = shm_unlink((char *)&g30); _exit(0); return result; } // 0x8048feb exec_argv[0] = (char *)a3; envp[0] = (char *)v15; result2 = fexecve(fd3, exec_argv, envp) / 256 % 256; // branch -> 0x804900a } // 0x804900a if (*(int32_t *)20 == v3) { // 0x804901a return result2; } // 0x8049056 __stack_chk_fail(); // branch -> 0x804905b // 0x804905b usleep(10); result = shm_unlink((char *)&g30); _exit(0); return result; } // 0x8048f40 // branch -> 0x8048f40 while (true) { // 0x8048f40 g5 = v9; if (read(g2, (char *)g3, 16) >= 1) { int32_t * v16 = (int32_t *)g3; function_8049080(v16, v16, 16, (char *)&v6, 0); write(fd2, (char *)g3, 16); // branch -> 0x8048fa2 } int32_t v17 = g7 + 1; // 0x8048fa2 g7 = v17; if (v17 == v13 / 16) { // break -> 0x8048fab break; } // continue -> 0x8048f40 } // 0x8048fab close(g2); close(fd2); fd3 = shm_open((char *)&g30, O_RDONLY, S_IRWXU); v14 = vfork(); if (v14 < 0) { // 0x8049037 close(fd3); shm_unlink((char *)&g30); result2 = -1; // branch -> 0x804900a } else { // 0x8048fe9 if (v14 == 0) { // 0x804905b usleep(10); result = shm_unlink((char *)&g30); _exit(0); return result; } // 0x8048feb exec_argv[0] = (char *)a3; envp[0] = (char *)v15; result2 = fexecve(fd3, exec_argv, envp) / 256 % 256; // branch -> 0x804900a } // 0x804900a if (*(int32_t *)20 == v3) { // 0x804901a return result2; } // 0x8049056 __stack_chk_fail(); // branch -> 0x804905b // 0x804905b usleep(10); result = shm_unlink((char *)&g30); _exit(0); return result; } } } } } } // 0x8049028 close(g2); // branch -> 0x8049030 } // 0x8049030 // branch -> 0x804900a // 0x804900a if (*(int32_t *)20 == v3) { // 0x804901a return -1; } // 0x8049056 __stack_chk_fail(); // branch -> 0x804905b // 0x804905b usleep(10); result = shm_unlink((char *)&g30); _exit(0); return result; }
Los códigos deben ir en etiquetas GeSHi