Documente Academic
Documente Profesional
Documente Cultură
Sylkat nos propone tres retos, vamos a ver que nos dice sobre ello
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
Anlisis:
____
_| || |_ / ___| _ __ _ _
|_ .. _| | |
|_
__/ _` |/ __| |/ / \
|_||_|
\____|_| \__,_|\___|_|
#########################################################
#
#
Cracknival 1 (Fcil)
PasswordZip: AfE3BhA5g1p
Puedes parchear
#
#
Cracknival 2 (Fcil)
PasswordZip:
Puedes parchear.
#
#
Cracknival 3 (Moderado)
PasswordZip:
No puedes parchear.
#
#########################################################
Nosotros vamos a intentar NO Parchear nada y conseguir todos los retos, eso
espero.
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
Reversand0:
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
Podemos ver el CALL en verde que es ejecutado antes del chico malo e bueno, y es
con el TEST EAX,EAX que decide cual de los dos. Si entramos en dicho call vemos
esto:
Miramos el Buffer:
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
Le damos y
Anlisis:
Ejecutamos el CrackNival_2.exe:
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
Le pasamos un Detector:
Otro C++.
Podemos ver unos 4 == CheckBox, se pueden tildar todos, o uno, o dos etc, nosotros
vamos a trabajar siempre y es importante con el == Tildado el CheckBox
(Abajo/derecha).
Y metemos los datos:
Aqu hemos metido una Key de longitud de 0x10d Bytes, ya que viendo como
nuestro amigo Sylkat le gusta esa cifra 0x0Ah, del reto 1, vamos a ver si nuestra
Social Reversing nos funciona o no ?, le damos y vemos esto:
Reversand0:
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
Vemos otro CALL importante antes del Bad Boy, y el tpico TEST EAX, EAX,
vamos a probar a forzar el salto de 00401C2A == JE y vemos lo que nos tiene
reservado nuestro amigo Sylkat:->
Y vemos como nos saca un Password totalmente malo y no vlido para el ZIP.
As que no se puede parchear, ni tampoco era nuestra la idea de hacerlo, nos
vetemos de lleno dentro del CALL antes de decidir y vemos esto:
00401340 /$ 55
PUSH EBP
00401341 |. 57
PUSH EDI
00401342 |. 31C9
XOR ECX,ECX
00401344 |. 56
PUSH ESI
00401345 |. 53
PUSH EBX
00401346 |. 83EC 38
SUB ESP,38
00401349 |. A1 54604000
00401367 |. 8D1C28
0040136A |. 894424 08
00401375 |. 897424 0C
00401379 |. 897C24 04
0040137D |. 01F3
ADD EBX,ESI
0040137F |. 31F6
XOR ESI,ESI
00401381 |. 01FB
ADD EBX,EDI
00401383 |. BF 56555555
MOV EDI,55555556
00401388 |. 894424 10
0040139E |. 894424 18
004013EF |. EB 16
/XOR EAX,EAX
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
004013FD |. 83C1 01
|ADD ECX,1
00401400 |. 01C3
|ADD EBX,EAX
00401402 |. 83F9 0F
|CMP ECX,0F
00401405 |. 74 6B
MOV EAX,ECX
00401409 |. F7EF
|IMUL EDI
0040140B |. 89C8
|MOV EAX,ECX
0040140D |. C1F8 1F
|SAR EAX,1F
00401410 |. 29C2
|SUB EDX,EAX
00401412 |. 8D0452
00401415 |. 39C1
|CMP ECX,EAX
00401417 |.^ 74 D8
00401419 |. 83F9 01
CMP ECX,1
0040141C |. 74 5E
JE SHORT CrackNiv.0040147C
0040141E |. 83F9 02
CMP ECX,2
CMP ECX,4
00401439 |. 83F9 07
00401442 |. 83F9 08
JE CrackNiv.00401555
CMP ECX,8
JE CrackNiv.0040152D
CMP ECX,0A
JE CrackNiv.00401507
CMP ECX,0B
00401462 |. 83F9 0E
JE CrackNiv.0040157D
CMP ECX,7
00401460 |. 74 57
JE CrackNiv.004015A6
CMP ECX,5
0040145D |. 83F9 0D
JE CrackNiv.004015CF
JE CrackNiv.004014DF
CMP ECX,0D
JE SHORT CrackNiv.004014B9
CMP ECX,0E
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
00401465 |. 74 31
JE SHORT CrackNiv.00401498
ADD ECX,1
0040146A |. 83C6 01
ADD ESI,1
0040146D |. 83F9 0F
CMP ECX,0F
00401470 |.^ 75 95
ADD ESP,38
00401475 |. 89D8
MOV EAX,EBX
00401477 |. 5B
POP EBX
; 00A10B40
00401478 |. 5E
POP ESI
; 00A10B40
00401479 |. 5F
POP EDI
; 00A10B40
0040147A |. 5D
POP EBP
0040147B |. C3
RETN
; 00A10B40
Buffer:
0022F8F4 00406038 ASCII "asdfghjklz"
0022F8F4 00406038 ASCII "1234567890" == ID !!
34567890...
0FBE05 2C604000
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
10
004013F3
80B9 28604000 2D
0FBE86 38604000
Aqu:
00401483
2B0424
00401486
034424 08
0040148A
394424 10
ID = Key ?!
ID == 1234567890
Key == asdfghjklz
Para:->
Q234567890
a1dfghjklz
a1d-ghjklz
-------
Para:->
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
11
QB34567890
a1!-ghjklz
-----------------------
Para:->
0x03 Byte ID == 0x05 Byte Key == "3" = "g" == = 61h = "a" - 0x1F == 42h
QBa4567890
a1!-Bhjklz
-----------------------
Para:->
0x04 Byte ID == 0x05 Byte Key == "4" = "h" == -23h == 23h + 23h = 46h ="F"
QBaF567890
a1!-B#jklz
-----------------------
004013F3
80B9 28604000 2D
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
12
QBaF567890
a1!-B#-klz
-----------------
Para:->
0x05 Byte ID == 0x05 Byte Key == "5" = "k" == 25h +25h == 4Ah
QBaFo67890
a1!-B#-Jlz
-----------------------
Para:->
QBaFou7890
a1!-B#-JNz
-----------------------
004013F3
80B9 28604000 2D
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
13
QBaFou7890
a1!-B#-JN-z
----------------------------
Para:->
QBaFouq890
a1!-B#-JN-T
---------------------------------------------------
Para:->
0x08 Byte ID == 0x05 Byte Key == "8" = "x" == 21h + 21h == 42h
QBaFouqB90
a1!-B#-JN-T!
---------------------------------------------------
004013F3
80B9 28604000 2D
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
14
QBaFouqB90
a1!-B#-JN-T!-kl
-----------------------------------------
Para:->
0x09 Byte ID == 0x05 Byte Key == "9" = "k" = Byte 0x07 = "q" == 79h
QBaFouqB+0
a1!-B#-JN-T!-yl
-------------------------------------------------
Para:->
QBaFouqB+Q
a1!-B#-JN-T!-y6
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
15
Anlisis:
Ejecutamos el CrackNival_3.exe:
Y vemos una tpica consola de LinuX y estamos como usario Guest que lastima no
ser root je ;
Vamos a darle a un habitual comando de Linux como es help y vemos esto:
Nustro amigo Sylkat nos lo pone fcil por si no sabes como se hace en Linux un
dir, pero como veremos este detalle sin inportancia, es lo de menos, lo ms
complicado tiene que venir an.
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
16
Le pasamos un detector:
Otro C++.
El objetivo de este reto es conseguir el Cdigo Fuente de los tres retos, as que
probamos si hay suerte y hacemos un catas:
Y podemos pensar que los Bytes estn, pero de momento no son visibles, luego lo
veremos, as que vamos a empezar por obtener los datos correctos de este reto.
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
17
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
18
B32Chars
db
"@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy
z-@",0
flepTrtlxu == 1082d
rhuzmnMglv == 1082d
zfAxqyyehq == 1082d
Y los registros:
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
19
Bien ! Podramos pensar que el trabajo esta hecho, pero si vemos la consola, dando
a F9 en el Olly :->
Hemos pasado el 1 Check, pero algo sigue fallando, as que miramos a partir de
este control y caemos en esta zona:->
Este cdigo parece fcil a simple vista, pero nada ms lejos de la realidad, para
resumirlo, es otro control sobre el Password tipo HASH y coge cada 0x01 Byte del
Password introducido y le hace un XOR con una Tabla Hard-Codeada, que aqu
vemos:
2.- Check == HASH == B7h ! == 0x01 == F6h XOR 0x01 Byte PassWord == 0x48h
Xor 0xFFh !
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
20
Hasta aqu un Pasword con dos HASHs fijos, con uno se abre la venta de
posibilidades al hacer el Brute-Force, pero con dos se abren millones, as que
ajustamos nuestro cdigo en ASM, quedando as:
key db
00h,03Eh,07Ch,042h,0F8h,0C6h,084h,0BAh,095h,0ABh,0E9h,0D7h,06Dh,053h,01
1h,02Fh,04Fh,071h,033h,00Dh,0B7h,089h,0CBh,0F5h,0DAh,0E4h,0A6h,098h,022
h,01Ch,05Eh,060h
db
09Eh,0A0h,0E2h,0DCh,066h,058h,01Ah,024h,00Bh,035h,077h,049h,0F3h,0CDh,08
Fh,0B1h,0D1h,0EFh,0ADh,093h,029h,017h,055h,06Bh,044h,07Ah,038h,006h,0BC
h,082h
db 0C0h,
0FEh,059h,067h,025h,01Bh,0A1h,09Fh,0DDh,0E3h,0CCh,0F2h,0B0h,08Eh,034h,0
0Ah,048h,076h,016h,028h,06Ah,054h,0EEh,0D0h,092h,0ACh,083h,0BDh,0FFh,0C
1h
db 07Bh,045h,
007h,039h,0C7h,0F9h,0BBh,085h,03Fh,001h,043h,07Dh,052h,06Ch,02Eh,010h,0A
Ah,094h,0D6h,0E8h,088h,0B6h,0F4h,0CAh,070h,04Eh,00Ch,032h,01Dh,023h
db 061h,05Fh,0E5h,
0DBh,099h,0A7h,0B2h,08Ch,0CEh,0F0h,04Ah,074h,036h,08h,027h,019h,05Bh,065
h,0DFh,0E1h,0A3h,09Dh,0FDh,0C3h,081h,0BFh,05h,03Bh,079h,047h,068h
db 056h,014h,02Ah,
090h,0AEh,0ECh,0D2h,02Ch,012h,050h,06Eh,0D4h,0EAh,0A8h,096h,0B9h,087h,0
C5h,0FBh,041h,07Fh,03Dh,003h,063h,05Dh,01Fh,021h,09Bh,0A5h,0E7h,0D9h,0F
6h
db 0C8h,08Ah,
0B4h,00Eh,030h,072h,04Ch,0EBh,0D5h,097h,0A9h,013h,02Dh,06Fh,051h,07Eh,04
0h,002h,03Ch,086h,0B8h,0FAh,0C4h,0A4h,09Ah,0D8h,0E6h,05Ch,062h,020h,01E
h,031h,00Fh
db
04Dh,073h,0C9h,0F7h,0B5h,08Bh,075h,04Bh,009h,037h,08Dh,0B3h,0F1h,0CFh,0
E0h,0DEh,09Ch,0A2h,018h,026h,064h,05Ah,03Ah,004h,046h,078h,0C2h,0FCh,0B
Eh,080h,0AFh, 091h,0D3h,0EDh
db
057h,069h,02Bh,015h,0FFh,000h,000h,000h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0
FFh,0FFh,00Ch,031h,040h,000h,002h,000h,000h,000h,0FFh,0FFh,0FFh,0FFh,
0F0h,02Fh,040h,000h,000h,030h,040h,000h,0BBh
db
04Ch,0D9h,08Fh,044h,0B3h,026h,070h,000h,000h,000h,000h,000h,000h,000h,000
h
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
21
B32Chars
db
"@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy
z-@",0
Y despus de un buen rato, Brute-Forceando, nos vamos a tomar una Birra bien
fra y unas tapas, y al volver vemos que nos da este Password vlido:->
wmnpexandh
? Rompe la consola totalmente ! Vamos a ver si hemos pasado los 2 Checks y que
est pasando para que pase esto.
Abrimos el Olly y metemos los mismos datos que arriba y parados en los controles,
aqu:
Miramos EAX:
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
22
Nuestro Password ha pasado con xito el 2 control, y traceamos hasta llegar aqu:
Esto pinta mal ! Una llamada a VirtualProtect para , seguimos hasta llegar
aqu:
004016E2 |> /8B45 F4
CrackNiv.00401594
/MOV EAX,[LOCAL.3]
004016E5 |. |0FB600
004016E8 |. |83F0 D8
|XOR EAX,FFFFFFD8
004016EB |. |0FBEC0
|MOVSX EAX,AL
004016EE |. |8945 D4
|MOV [LOCAL.11],EAX
004016F1 |. |8B55 F0
|MOV EDX,[LOCAL.4]
004016F4 |. |8B45 08
|MOV EAX,[ARG.1]
004016F7 |. |01D0
ntdll.KiFastSystemCallRet
|ADD EAX,EDX
004016F9 |. |0FB600
004016FC |. |83F0 D8
|XOR EAX,FFFFFFD8
004016FF |. |0FBEC0
|MOVSX EAX,AL
00401702 |. |8945 EC
|MOV [LOCAL.5],EAX
00401705 |. |837D F0 00
00401709 |. |75 04
|CMP [LOCAL.4],0
|JNZ SHORT CrackNiv.0040170F
0040170B |. |8345 EC 2D
|ADD [LOCAL.5],2D
|CMP [LOCAL.4],1
00401713 |. |75 04
00401715 |. |836D EC 11
|SUB [LOCAL.5],11
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
23
|CMP [LOCAL.4],2
|JNZ SHORT CrackNiv.00401723
0040171F |. |8345 EC 4C
|ADD [LOCAL.5],4C
|CMP [LOCAL.4],3
00401727 |. |75 04
00401729 |. |8345 EC 4B
|ADD [LOCAL.5],4B
|CMP [LOCAL.4],4
00401731 |. |75 04
00401733 |. |8345 EC 46
|ADD [LOCAL.5],46
|CMP [LOCAL.4],5
0040173B |. |75 04
0040173D |. |8345 EC 1D
|ADD [LOCAL.5],1D
|CMP [LOCAL.4],6
00401745 |. |75 04
00401747 |. |8345 EC 12
|ADD [LOCAL.5],12
|CMP [LOCAL.4],7
0040174F |. |75 07
|ADD [LOCAL.5],9F
|CMP [LOCAL.4],8
0040175E |. |836D EC 2E
|SUB [LOCAL.5],2E
|CMP [LOCAL.4],9
00401766 |. |75 04
00401768 |. |8345 EC 3A
|ADD [LOCAL.5],3A
|MOV EAX,[LOCAL.5]
0040176F |. |89C2
|MOV EDX,EAX
00401771 |. |8B45 F4
CrackNiv.00401594
|MOV EAX,[LOCAL.3]
00401774 |. |8810
00401776 |. |8345 F4 01
|ADD [LOCAL.3],1
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
24
0040177A |. |8B45 D4
msvcrt.77C0B991
|MOV EAX,[LOCAL.11]
0040177D |. |0145 E8
|ADD [LOCAL.6],EAX
00401780 |. |8345 F0 01
|ADD [LOCAL.4],1
CMP [LOCAL.4],9
\JLE CrackNiv.004016E2
0040178E |> 90
NOP
0040178F |> C9
LEAVE
Vemos marcado los 10 Bytes sin sentido, aqu le escrib a Sylkat y como era de
esperar me respondi muy amablemente y gran persona, le coment que aqu tena
que ir algo, y me dijo que era un tipo de JMP o CALL a una zona donde se
supone que se dan permisos de root, le coment que un Brute-Force era inviable
al tener 3 controles, hemos pasados 2, pero el 3 que escriba unos 10 Bytes con
sentido, eso sucedera cuando el hombre haya evolucionado a una Ente superior y
el Universo sea solo un espacio para 01010100, en resumen, para encontrar el
Password que Sylkat puso para pasar los 3 controles ser siendo un misterio hasta
hoy, debido que son HASH Hard-Codeados, por eso nosotros, parados aqu con el
Olly, debemos obtener el Cdigo Fuente sin parchear nada, as que nos vamos a
una Zona que me llamo la atencin y es esta:
004017FD /$ 55
004017FE |. 89E5
00401800 |. 83EC 28
PUSH EBP
MOV EBP,ESP
SUB ESP,28
MOV [LOCAL.4],0C570DC
00401812 |. 8B45 08
MOV EAX,[ARG.1]
|CrackNiv.<ModuleEntryPoint>
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
25
00401815 |. 890424
;|
00401818 |. E8 4B180000
; \strcmp
CALL <JMP.&msvcrt.strcmp>
0040181D |. 85C0
TEST EAX,EAX
0040181F |. 75 41
MOV [LOCAL.3],0
/MOV EAX,[LOCAL.3]
0040183A |. EB 26
|MOV EAX,[LOCAL.3]
|MOV EDX,EAX
|MOV EAX,[LOCAL.3]
|ADD [LOCAL.3],1
CMP [LOCAL.3],98967F
0040186A |. 8B45 08
MOV EAX,[ARG.1]
|CrackNiv.<ModuleEntryPoint>
0040186D |. 890424
;|
|XOR EAX,[LOCAL.4]
0040184B |. 8B45 F4
kernel32.7C8399F3
00401855 |. 8345 F4 01
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
26
00401870 |. E8 F3170000
; \strcmp
CALL <JMP.&msvcrt.strcmp>
00401875 |. 85C0
TEST EAX,EAX
00401877 |. 75 48
MOV [LOCAL.3],0
/MOV EAX,[LOCAL.3]
00401898 |. 90
|NOP
00401899 |. EB 26
|MOV EAX,[LOCAL.3]
|XOR EAX,[LOCAL.4]
004018A8 |. 89C2
|MOV EDX,EAX
004018AA |. 8B45 F4
kernel32.7C8399F3
|MOV EAX,[LOCAL.3]
CMP [LOCAL.3],98967F
004018C9 |. 8B45 08
MOV EAX,[ARG.1]
|CrackNiv.<ModuleEntryPoint>
004018CC |. 890424
;|
|CMP EAX,-1
00401896 |. 75 03
004018BF |.^ 7E C8
MOV [LOCAL.4],0E71DA54
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
27
004018CF |. E8 94170000
; \strcmp
CALL <JMP.&msvcrt.strcmp>
004018D4 |. 85C0
TEST EAX,EAX
004018D6 |. 75 48
MOV [LOCAL.3],0
/MOV EAX,[LOCAL.3]
|MOV EAX,[LOCAL.3]
|MOV EDX,EAX
|MOV EAX,[LOCAL.3]
00401920 |> C9
00401921 \. C3
|XOR EAX,[LOCAL.4]
00401909 |. 8B45 F4
kernel32.7C8399F3
00401913 |. 8345 F4 01
|CMP EAX,-1
004018F8 |. EB 26
00401907 |. 89C2
MOV [LOCAL.4],2D0E8E9
CMP [LOCAL.3],98967F
004017FD /$ 55
PUSH EBP
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
28
Miramos el Buffer:
Estamos en un Bucle Caliente que nos va a sacar el Cdigo Fuente desde 00404040,
del primer reto, pasamos todo con un BP al salir del JLE y vemos esto en el
Dump:>
Ah lo tenemos !!
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
29
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
30
#include <psapi.h>
#include <excpt.h>
HINSTANCE hInst;
char userBuffer[16];
char keyBuffer[16];
char passwordBuffer[16];
char passwordZip[16];
int validate();
int list_processes( void );
void PrintProcessNameAndID( DWORD );
void getPasswordZip();
char *cls="...hello.cls..;)..";
switch(uMsg)
{
case WM_INITDIALOG:
{
}
return TRUE;
case WM_CLOSE:
{
EndDialog(hwndDlg, 0);
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
31
return TRUE;
case WM_COMMAND:
{
//printf("Hello world window gui:%d\n",wParam);
switch(LOWORD(wParam))
{
case IDOK:
//list_processes();
handle=GetDlgItem(hwndDlg, PASS_TEXT);
GetWindowText(handle,keyBuffer,11);
handle=GetDlgItem(hwndDlg, USER_TEXT);
GetWindowText(handle,userBuffer,11);
handle=GetDlgItem(hwndDlg, CODE_NEXT_CRACK);
strcpy(passwordBuffer,"User:");
strcat(passwordBuffer,userBuffer);
if(validate()){
MessageBox(NULL, "Key incorrect :(", "Aissshh", NULL);
}else{
getPasswordZip();
MessageBox(NULL, "You did it ;)", passwordZip, NULL);
SetWindowText(handle,passwordZip);
}
break;
case 2:
break;
}
}
return TRUE;
}
return FALSE;
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
32
int validate(){
char *buffer=".hot.hot.hot.";
int i=0;
for(i=0;i<10;i++){
passwordBuffer[i]=userBuffer[i]-1;
}
passwordBuffer[i]='\0';
//printf("%s\n%s\n",passwordBuffer,keyBuffer);
if(strcmp(passwordBuffer,keyBuffer)){
return 1;
}else{
return 0;
}
}
void getPasswordZip(){
char *palermo=".palermo.te.espera.";
int i;
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
33
char tmp;
passwordZip[0]='\0';
for(i=0;i<10;i++){
tmp=userBuffer[i]-passwordBuffer[i]+((i*i)/2);
sprintf(passwordZip,"%s%d",passwordZip,tmp);
//printf("%s\n",passwordZip);
}
passwordZip[i]='\0';
}
Seguimos, con el segundo, New Origin here en Olly aqu:
Aqu como antes, evitar que nos saque el JNZ y BP al salir y luego nos vamos a que
lo muestre aqu:
004019CA |> \C74424 04 81724300
SS:[ESP+4],CrackNiv.00437281
Aqu cabe decir que Sylkat no tuvo en cuenta un detalle, lo cantidad de bytes del
segundo *.cpp es muy alta y la CMD de Windows tiene un buffer de mximo, y no
los muestra todos, por eso haremos un truco, solo que en vez de golpe, haremos
poco a poco todos los Bytes para poder ser copiados, haba una Funcin en el cdigo
para escribir datos, pero lo haremos as es ms limpio, si nos fijamos aqu:
00401A12 |> \817D F4 7F969800
CMP [LOCAL.3],98967F
HINSTANCE hInst;
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
34
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
35
case WM_CLOSE:
{
EndDialog(hwndDlg, 0);
}
return TRUE;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDOK:
HERE_WE_ARE:
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
36
PostMessage(hCheck, BM_SETCHECK,BST_PUSHED,0);
}else{
PostMessage(hCheck, BM_SETCHECK,BST_UNCHECKED,0);
}
break;
}
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
37
return TRUE;
}
return FALSE;
}
int validate(){
int i=0,e;
e=OLLY_DETECTED+SBP_DETECTED+HBP_DETECTED+NOT_ALLOW;
e=0;
int value=32;
int idxUser=0;
SBP_DETECTED=0;
HBP_DETECTED=0;
NOT_ALLOW=0;
//kryzoxyzzz
//-KQ-ZW-JQ-\Y-W_
for(i=0;i<15;i++){
if(i%3==0){
if(keyBuffer[i]!='-'){
//printf("Not detected sep: %c\n",keyBuffer[i]);
e++;
}
continue;
}else if(i==1){
if(keyBuffer[i]!=userBuffer[idxUser]-value+OLLY_DETECTED){
//printf("1-%c\n",userBuffer[idxUser]-value);
e++;
}
}else if(i==2){
value=33;
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
38
if(keyBuffer[i]!=userBuffer[idxUser]-value+SBP_DETECTED){
//printf("2-%c-->%c\n",userBuffer[idxUser]-value,keyBuffer[i
]);
e++;
}
}else if(i==4){
value=31;
if(keyBuffer[i]!=userBuffer[idxUser]-value+HBP_DETECTED){
//printf("3-%c\n",userBuffer[idxUser]-value);
e++;
}
}else if(i==5){
value=35;
if(keyBuffer[i]!=userBuffer[idxUser]-value+NOT_ALLOW){
//printf("4-%c\n",userBuffer[idxUser]-value+NOT_ALLOW);
e++;
}
}else if(i==7){
value=37;
if(keyBuffer[i]!=userBuffer[idxUser]-value-NOT_ALLOW){
//printf("5-%c\n",userBuffer[idxUser]-value);
e++;
}
}else if(i==8){
value=39;
if(keyBuffer[i]!=userBuffer[idxUser]-value-OLLY_DETECTED){
//printf("6-%c\n",userBuffer[idxUser]-value);
e++;
}
}else if(i==10){
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
39
value=29;
if(keyBuffer[i]!=userBuffer[idxUser]-value-SBP_DETECTED){
//printf("7-%c\n",userBuffer[idxUser]-value);
e++;
}
}else if(i==11){
value=33;
if(keyBuffer[i]!=userBuffer[idxUser]-value+HBP_DETECTED){
e++;
//printf("8-%c\n",userBuffer[idxUser]-value);
}
}else if(i==13){
value=35;
if(keyBuffer[i]!=userBuffer[idxUser]-value+NOT_ALLOW){
//printf("9-%c\n",userBuffer[idxUser]-value);
e++;
}
}else if(i==14){
value=27;
if(keyBuffer[i]!=userBuffer[idxUser]-value){
//printf("10-%c--->%c\n",userBuffer[idxUser]-value,keyBuf
[i]);
e++;
}
}
idxUser++;
}
//printf("Errors:%d\n",e);
return e;
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
40
void getZip(){
int manyints[10];
int clsints[10];
int idxUser=0;
int i=0;
for(i=0;i<15;i++){
if(i%3==0){
continue;
}else{
manyints[idxUser]=userBuffer[idxUser]-keyBuffer[i]+20;
printf("KeyZip:%d\n",manyints[idxUser]);
}
idxUser++;
}
manyints[0]=manyints[0]-7;
manyints[1]=manyints[1]+14;
manyints[2]=manyints[2]+25;
manyints[3]=manyints[3]+28;
manyints[4]=manyints[4]-12;
manyints[5]=manyints[5]-9;
manyints[6]=manyints[6]-1;
manyints[7]=manyints[7]-4;
manyints[8]=manyints[8]-1;
manyints[9]=manyints[9]-1;
printf("\n");
passwordZip[0]='\0';
for(i=0;i<10;i++){
sprintf(passwordZip,"%s%c",passwordZip,manyints[i]);
printf("KeyZip:%c\n",manyints[i]);
idxUser++;
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
41
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
42
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
43
/*
typedef NTSTATUS (NTAPI *pNtSetInformationThread)
//
NTSTATUS Status;
// Get NtSetInformationThread
pNtSetInformationThread NtSIT = (pNtSetInformationThread)
GetProcAddress(GetModuleHandle( TEXT("ntdll.dll") ),
"NtSetInformationThread");
// Shouldn't fail
if (NtSIT == NULL)
return false;
if (Status != 0x00000000)
return false;
else
return true;
*/
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
44
// if dumped
inline void ErasePEHeaderFromMemory()
{
DWORD OldProtect = 0;
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
45
sizeof(szProcessName)/sizeof(TCHAR) );
}
}
// Print the process name and identifier.
//_tprintf( TEXT("%s (PID: %u)\n"), szProcessName, processID );
// Release the handle to the process.
CloseHandle( hProcess );
//int resCmp=strcmp(szProcessName,"OLLYDBG.exe");
//printf("STRCMP RES%d\n",resCmp);
if(!strcmp(szProcessName,"OLLYDBG")){
NOT_ALLOW=1;
OLLY_DETECTED+=1;
return 1;
}
if(!strcmp(szProcessName,"ollydbg")){
NOT_ALLOW=1;
OLLY_DETECTED+=1;
return 1;
}
if(!strcmp(szProcessName,"ollydbg.exe")){
NOT_ALLOW=1;
OLLY_DETECTED+=1;
return 1;
}
if(!strcmp(szProcessName,"OLLYDBG.EXE")){
NOT_ALLOW=1;
OLLY_DETECTED+=1;
return 1;
}
return 0;
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
46
int pruebas(){
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
47
return 1;
}
continue;
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
48
void do_login();
void cypher();
void decypher(char *);
void you_did_it(char *);
void register_exit();
void printNoo();
int getSum(char*);
void writeFileIntoHeaderFileSource(char *,int );
void printSourceCode(char *file);
void emulateSystemShell();
void decryptSouceCode(char *);
char buffer[60];
char source_1[]="cr4ckn1v4L_1.cpp";
char source_2[]="cr4ckn1v4L_2.cpp";
char source_3[]="cr4ckn1v4L_3.cpp";
char USER[50];
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
49
void register_exit(){
strcpy(USER,"root");
decryptSouceCode(source_1);
decryptSouceCode(source_2);
decryptSouceCode(source_3);
//exit(0);
}
void printNoo(){
printf("\nAccess denied\n");
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
50
}
void do_login(){
//char *stackvar="AAAAAAAAAAAAAAAAA";
char name[20];
void (*fptr)(char *)=you_did_it;
char password[20];
//asfasfd=cypher;
printf("\n User:");
void (*fptr2)(char *)=you_did_it;
gets(name);
printf(" Password:");
gets(password);
//printf("\nAddress You did it
//printf("Address Register
: %x\n",you_did_it);
: %x\n",register_exit);
if(res==-1){
printf("Result mprotect: %d\n",errno);
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
51
perror("Error:");
return;
}
cyphFunction+=17;
int idx=0;
int xorEd;
int passxor;
int sumReal=0;
int sumPas=0;
unsigned int crcsum=crc8(9, (unsigned char*) phrase, 10);
//printf("Crc is: %u\n",crcsum);
if(getSum(phrase)==1082 && crcsum==183){
DWORD OldProtect = 0;
char *pBaseAddr = (char*)GetModuleHandle(NULL);
//printf("Changing permissions of memory from %x to %x\n",pBaseA
ddr, pBaseAddr+4096);
VirtualProtect(pBaseAddr, 4096*10, PAGE_READWRITE, &OldProtect);
for(idx=0;idx<10;idx++){
//printf("Value byte at addr-->%x:%d\n",cyphFunction,*cy
phFunction);
xorEd=*cyphFunction^-40;
passxor=phrase[idx]^-40;
if(idx==0){
passxor+=45;
}
if(idx==1){
passxor-=17;
}
if(idx==2){
passxor+=76;
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
52
}
if(idx==3){
passxor+=75;
}
if(idx==4){
passxor+=70;
}
if(idx==5){
passxor+=29;
}
if(idx==6){
passxor+=18;
}
if(idx==7){
passxor+=159;
}
if(idx==8){
passxor-=46;
}
if(idx==9){
passxor+=58;
}
//printf("Value password :(%d)%d\n",phrase[idx],passxor)
;
*cyphFunction=passxor;
cyphFunction++;
sumReal+=xorEd;
}
//printf("Final sum:%d\n",sumReal);
}
checkpoint:
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
53
return;
}
int getSum(char *password){
int idx,sumReal=0,passxor;
for(idx=0;idx<10;idx++){
if(idx==0 || idx==5){
passxor=password[idx]^-40;
}else{
passxor=password[idx]^40;
}
sumReal+=password[idx];
}
//printf("Final sum:%d\n",sumReal);
return sumReal;
}
}
}
if(!strcmp(file,source_2)){
key=242342484;
for(i=0;i<10000000;i++){
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
54
if(file_source_2[i]==EOF){
break;
}
file_source_2[i]=file_source_2[i]^key;
}
}
if(!strcmp(file,source_3)){
key=47245545;
for(i=0;i<10000000;i++){
if(file_source_3[i]==EOF){
break;
}
file_source_3[i]=file_source_3[i]^key;
}
}
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
55
0xfd, 0xc3, 0x81, 0xbf, 0x05, 0x3b, 0x79, 0x47, 0x68, 0x56, 0x14, 0x2a,
0x90, 0xae, 0xec, 0xd2, 0x2c, 0x12, 0x50, 0x6e, 0xd4, 0xea, 0xa8, 0x96,
0xb9, 0x87, 0xc5, 0xfb, 0x41, 0x7f, 0x3d, 0x03, 0x63, 0x5d, 0x1f, 0x21,
0x9b, 0xa5, 0xe7, 0xd9, 0xf6, 0xc8, 0x8a, 0xb4, 0x0e, 0x30, 0x72, 0x4c,
0xeb, 0xd5, 0x97, 0xa9, 0x13, 0x2d, 0x6f, 0x51, 0x7e, 0x40, 0x02, 0x3c,
0x86, 0xb8, 0xfa, 0xc4, 0xa4, 0x9a, 0xd8, 0xe6, 0x5c, 0x62, 0x20, 0x1e,
0x31, 0x0f, 0x4d, 0x73, 0xc9, 0xf7, 0xb5, 0x8b, 0x75, 0x4b, 0x09, 0x37,
0x8d, 0xb3, 0xf1, 0xcf, 0xe0, 0xde, 0x9c, 0xa2, 0x18, 0x26, 0x64, 0x5a,
0x3a, 0x04, 0x46, 0x78, 0xc2, 0xfc, 0xbe, 0x80, 0xaf, 0x91, 0xd3, 0xed,
0x57, 0x69, 0x2b, 0x15};
if (len == 0)
return crc;
crc ^= 0xff;
end = data + len;
do {
crc = crc8_table[crc ^ *data++];
} while (data < end);
return crc ^ 0xff;
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
56
break;
}
}
}
if(!strcmp(file,source_2)){
for(i=0;i<10000000;i++){
printf("%c",file_source_2[i]);
if(file_source_2[i]==EOF){
break;
}
}
}
if(!strcmp(file,source_3)){
for(i=0;i<10000000;i++){
printf("%c",file_source_3[i]);
if(file_source_3[i]==EOF){
break;
}
}
}
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
57
return;
}
fprintf(fileHeader,"int source={");
while (byte=fgetc(file)){
/* note that fgets don't strip the terminating \n, checking its
presence would allow to handle lines longer that sizeof(line) */
printf("%c", byte);
if(byte==EOF){
fprintf(fileHeader,"0x%x,",byte);
break;
}
byte=byte^key;
fprintf(fileHeader,"0x%x,",byte);
}
fprintf(fileHeader,"};");
fclose(fileHeader);
fclose(file);
}
void emulateSystemShell(){
int mode_response=0;
char shellHead[256];
strcpy(shellHead,USER);
strcat(shellHead," $ ");
printf("##################################\n");
printf("# Welcome to Cr4ckn1val Server #\n");
printf("#
Enjoy
#\n");
printf("##################################\n");
while(1==1){
strcpy(shellHead,USER);
strcat(shellHead," $ ");
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
58
printf(shellHead);
char response[256];
scanf("%255s",response);
if(!strcmp(response,"\n")){
mode_response=0;
continue;
}
if(!strcmp(response,"help") || !strcmp(response,"?") ){
printf("(s3cure sh3ll):\nls\ncat\nlogin\nid\nexit\n");
mode_response=0;
continue;
}
if(!strcmp(response,"dir") || !strcmp(response,"ls") ){
printf("%s\n%s\n%s\n",source_1,source_2,source_3);
mode_response=0;
continue;
}
if(!strcmp(response,"id")){
printf(USER);
printf("\n");
mode_response=0;
continue;
}
if(!strcmp(response,"login")){
gets(response);
do_login();
}
if(!strcmp(response,"exit")){
printf("Bye,");
exit(0);
}
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
59
if(!strcmp(response,"cat")){
mode_response=1;
continue;
}
if(!strcmp(response,source_1)){
if(mode_response==1){
if(!strcmp(USER,"root")){
printSourceCode(source_1);
}else{
printf("Access denied.\n");
}
}
mode_response=0;
continue;
}
if(!strcmp(response,source_2) ){
if(mode_response==1){
if(!strcmp(USER,"root")){
printSourceCode(source_2);
}else{
printf("Access denied.\n");
}
}
mode_response=0;
continue;
}
if(!strcmp(response,source_3) ){
if(mode_response==1){
if(!strcmp(USER,"root")){
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
60
printSourceCode(source_3);
}else{
printf("Access denied.\n");
}
}
mode_response=0;
continue;
}
//printf("'%s'",response);
}
}
Ah lo tenemos todo !
Ahora teniendo el cdigo fuente del 3 *.cpp le dejo al lector entender el cdigo en
C++ y ver si puede sacar el Password original que pens Sylkat
Nosotros hemos cumplido con los 3 retos sin parchear nada, y solo en el tercero
hemos hecho cambios en el EIP del binario para sacar los cdigos fuentes de los 3
proyectos.
Adjunto los 3 *.CPP y todo los binarios en un RAR para mayor comodidad.
D3m0n3vX
16/10/2016.-
Solucin_Al_Reto_Cracknival_1_2_y_3_Por_D3m0n3vX
61