3 Ocak 2010

4.294.967.295+1

Programcılık ile uğraşıyorsanız ve projelerinizde zamansal kontroller yada checksum gibi toplamsal kontroller yaptıysanız bir şekilde Crc32 Algoritması yada GetTickCount Api'sini kullanmışsınızdır.

Crc32 Algoritması; Dword değerlerden oluşan 256 adet keyin kullanıldığı bir tabloyu baz alarak hash hesabı yapan bir fonksiyon. Sonunda hesaplanan hash yine 4byte'lık bir değerdir.

@Crc32: ;<= Procedure Start
   PUSH EBP
   MOV EBP,ESP
   PUSH EBX
   PUSH ESI
   OR EAX,0FFFFFFFFh
   MOV ECX,[ARG.2] ;Stack SS:[0012FEA8]=000A2540
   MOV EDX,[ARG.1] ;Stack SS:[0012FEA4]=7FEB0010, (ASCII "MZP")
   JMP @2

@1:

   MOVSX ESI,BYTE PTR DS:[EDX]
   MOV EBX,EAX
   XOR EAX,ESI
   AND EAX,0FFh
   SHR EBX,8
   XOR EBX,DWORD PTR DS:[EAX*4+(Ctc Table Adress)]
   INC EDX
   MOV EAX,EBX

@2:

   MOV EBX,ECX
   ADD ECX,-1
   TEST EBX,EBX
   JNZ @1
   NOT EAX ;Checksum
   POP ESI
   POP EBX
   POP EBP
   RETN ;<= Procedure End
 Aşağıda ki tablo, yukarıdaki crc32 fonksiyonu ile bir dosyanın son 5 baytı okunurken hesaplanmış değerlerdir.




          bn+1 = fn

 Bu dosyanın checksum değeri istenilen bir değer ile değiştirilmek istendiğinde tablodaki değerler kullanılarak brüte edilebilir.

 Hedef Checksum: 0000BAC2 -> not checksum = f4 = FFFF45D3
xor f4,[h4] = e4 -> h4/4 = d4 -> c4
xor c
4,a4 = b4 = f3

xor f
3,[h3] = e3 -> h3/4 = d3 -> c3
xor c
3,a3 = b3 = f2

xor f
2,[h2] = e2 -> h2/4 = d2 -> c2
xor c
2,a2 = b2 = f1

xor f
1,[h1] = e1 -> h1/4 = d1 -> c1
xor c
1,a1 = b1 = f0
 f= D20296F9

Sonuç itibari ile Checksum 4 baytlık bir değer, 4 baytın her biri için crc tablosunun her değeri denenerek brüte edilir. Crc Table 256 adet keyden oluştuğuna göre n^4 deneme demek oluyor. 256^4 = 4.294.967.296


GetTickCount Api'si  işletim sistemi başladığı anda resetlenir ve her ms (milisaniye) değeri 1 artan işletim sistemine has bir değerdir.

DWORD GetTickCount(VOID), geri dönüş değeri 4 byte olduğuna göre yani 32 bit işaretsiz bir tamsayı.
Değer aralığı ise 0, .., 4.294.967.295 arasındadır. saat 23:59'dan sonra 00:00 olduğu gibi 4.294.967.295+1 ms sonra yani 49,71 gün sonra bu değer sıfırlanır.


Bunları neden yazdım? Bende bilmiyorum. :) Öylesine bir karalama...

0 yorum:

Kaspersky Real Tİme Protection Inactive with Windows Vulneblarity RootKit MS Windows ve ona bağlı çalışan yazılımların acizliğine bir örnek. This is a show, not technical knowledge. YouTube Daha net görüntü için Orjinal Videoyu izleyebilirsiniz.