Maxxovo CRACK ME 17 Jak jsem potkal diskrétní Fourierovo transformaci. Aneb NOP mě asi ukamenuje až to uvidí :-) Jára da Cimrman
ã«
dREAM TEAM Stručná ukázka jak používat matematiku v reverzním inženýrství.
1 Unpack Natáhnu cme17.exe do olly a co nevidim, standardni FSG, takze hw breakpoint na místo kam ukazuje první podmíněněj jump delší než pár řádek. F9 a boom, jsem na OEP. Dump pomocí Ollydumpu. A jde se na IDU.
2 Reverzní inženýrství Hmm, natáhnul jsem dumplé exe do IDY a nestačil se divit, samej jmp o 3 bajty, Maxx si trochu pohrál s makrama. Stačilo jenom jenom napsat malý skript a všechno bylo daleko čitelnější. V takhle krátkém kódu jsem nepotřeboval nikde hledat, stačil pgdn a hned jsem našel fci která všechno checkuje(0x0401576). Na 0x04015A9 se načte text z pole sn. A začnou se dít divy. seg000:004015B1 seg000:004015B9 seg000:004015BE seg000:004015C4 seg000:004015CA seg000:004015D0 seg000:004015D6 seg000:004015DC boy seg000:004015DF seg000:004015E8 seg000:004015EE seg000:004015F4 seg000:004015FA seg000:00401600 seg000:00401606 seg000:0040160C seg000:0040160E seg000:00401617 seg000:0040161D seg000:00401623 seg000:00401629 seg000:0040162F seg000:00401635 seg000:0040163B
mov esi, offset text; do esi se natáhne ukazatel na text xor edx, edx; dl se znuluje add dl, [esi+sn.field_2] ; dl = field_2 xor dl, [esi+sn.field_5] ; dl = field_2 xor field_5 add dl, [esi+sn.field_8] ; dl = (field_2 xor field_5) + field_8 xor dl, [esi+sn.field_B] ; dl = ((field_2 xor field_5) + field_8) add dl, [esi+sn.field_E] ; dl = ((field_2 xor field_5) + field_8) + field_E cmp dl, [esi+sn.field_2] ; dl = ((field_2 xor field_5) + field_8) + field_E = field_2 jinak bad jnz sub add add add add xor test jnz add sub sub sub mov mov mov
bad_boy dl, [esi+sn.field_2] ; dl předtim mělo hodnotu field_2, takže se znulovalo dl, [esi+sn.field_5] ; dl = field_5 dl, [esi+sn.field_8] ; dl = field_5 + field_8 dl, [esi+sn.field_B] ; dl = field_5 + field_8 + field_B dl, [esi+sn.field_E] ; dl = field_5 + field_8 + field_B + field_E dl, 172; spolu s test edx, edx tvoří podmínku dl = 172 jinak bad_boy edx, edx bad_boy dl, [esi+sn.field_8] ; dl = field_8 [esi+sn.field_2], dl ; field_2 = field_2 - field_8 [esi+sn.field_5], dl ; field_5 = field_5 - field_8 [esi+sn.field_B], dl ; field_B = field_B - field_8 dl, [esi+sn.field_2]; dl = field_2 - field_8 [esi+sn.field_8], dl ; field_8 = field_2 - field_8 [esi+sn.field_E], dl; field_E = field_2 - field_8
1
Author Name Takže si to shrňme: ze sn se načítají bajty, 2, 5, 8, E a zkoumají se na součet a následně se odčítají. Když se koukneme dál zjistíme, že se takto upravené sn posílá do atol(ascii to long), to jak všichni víme bere nulou ukonč ený string, takže bude nejlépe aby ty SUBy nakonci rozdělili sn na šest dvouciferných čísel oddělených nulou. Z 40161D plyne, že field_2 se musí rovnat field_8 a to pak i field_5, field_B, field_B. Z 401606 plyne, že součet 172 ÅÅÅÅÅÅ = 34 = ' + '. Takž field_5 + field_8 + field_B + field_E = 4 field_2 = 172, odsud už dostáváme, že field_2 = ÅÅÅÅ 4 e sn je tvaru aa+bb+cc+dd+ee+ff. Pokračujem dál a najdem kontrolu zda jsou všechna zadaná čísla navzájem různá a zda splňují následující podmínky: a+b+c = d +e+ f
(1)
a2 + b2 + c2 = d 2 + e2 + f 2
(2)
a∫b∫c∫d∫e∫ f
(3)
0 § a < 99 Ï 0 § b < 99 Ï 0 § c < 99 Ï 0 § d < 99 Ï 0 § e < 99 Ï 0 § f < 99 8a, b, c, d, e , f < œ
(4) (5)
3 Matematika Zapeklitá věc. Udělal jsem bruteforcer a začal zkoumat čísla co z něj padali. Chvíli jsem na ně koukal ale nic mě nenapadalo, tak jsem nahodil Copernic desktop search, zadal "sum of squares” a v jednom pdf(fxtbook.ps.pdf) naš el, že pro Fourierovo transformaci platí: ‚ a2x = ‚ c2k Kde a = 8a0 , a1 , a2 …an-1 <, c = Fourier[a]
n-1
n-1
x=0
k=0
2
Article Title To vypadalo nadějně, ale ukázalo se, že buď nechápu zadání, nebo že to neplatí. Každopádně mě to přivedlo na myšlenku vzít {a,b,c} z (1) , nacpat to do Fouriera a zobrazit si to v Gaussově rovině. To samé jsem udělal i pro {d, e, f} a dostal takovéto obrázky(červená barva je první trojice, čáry přidány jen pro zvýraznění, to co vyleze z Fouriera po zadání trojice čísel jsou body na koncích.): 0.75
0.5
0.25
5
10
15
-0.25
-0.5
-0.75
obr 1: {8, 3, 4}, {2, 6, 7} fl 915, ÅÅ1ÅÅ I9 - i 2
è!!!! 1 è!!!! è!!!! è!!!! 3 M, ÅÅÅÅ I9 + i 3 M= , 915, - ÅÅ1ÅÅ i I-9 i + 3 M, ÅÅ1ÅÅ i I9 i + 3 M= 2
2
2
40 20
60
80
100
120
-20 -40 obr 2: {80, 37, 14}, {64, 62, 5} fl 9131, ÅÅ1ÅÅ I109 + 23 i 2
è!!!! 1 è!!!! è!!!! è!!!! 3 M, ÅÅÅÅ I109 - 23 i 3 M= , 9131, ÅÅ1ÅÅ I61 + 57 i 3 M, ÅÅ1ÅÅ I61 - 57 i 3 M= 2
2
2
0.75 0.5 0.25 50
100
150
200
250
-0.25 -0.5 -0.75 obr 3: {90, 94, 95}, {96, 92, 91} fl 9279, - ÅÅ1ÅÅ i I-9 i + 2
è!!!! 1 è!!!! è!!!! è!!!! 3 M, ÅÅÅÅ i I9 i + 3 M= , 9279, ÅÅ1ÅÅ I9 + i 3 M, ÅÅ1ÅÅ I9 - i 3 M= 2
2
3
2
Author Name
4
2
50
100
150
200
250
-2
-4 obr 4: {94, 90, 95}, {96, 92, 91} fl 9279, ÅÅ1ÅÅ I3 - 5 i 2
è!!!! 1 è!!!! è!!!! è!!!! 3 M, ÅÅÅÅ I3 + 5 i 3 M= , 9279, ÅÅ1ÅÅ I9 + i 3 M, ÅÅ1ÅÅ I9 - i 3 M= 2
2
2
Značení: z trojice {a,b,c} po Fourierově transformaci vyleze trojice {f1, f2, f3}, z trojice {d, e, f} vyleze {g1, g2, g3} Pozorování 1: f2 a f3 resp. g2, g3 jsou čísla komplexně sdružená. Pozorování 2: pro některé trojice (obr. 1) to vypadá, že f2 = - g2 a f3 = g3, překlopené podle osy y. Pozorování 3: stačilo prohodit pořadí čísel ve vstupu do Fouriera a vznikl jiný obrázek(obr 3 × obr 4), takže permutací vstupní množiny dostanu všechny obrázky pro daný vstup. 4
2
50
100
150
-2
-4
obr 5: permutace všech vstupů z obr 4
4
200
250
Article Title Hmm, f1, g1 tam zaclání, takže je odstraníme. 4
2
-4
-2
2
4
-2
-4
obr 6: o moc lepší obrázek 5
Pozorování 4: Vypadá to, že se body f2, f3, g2, g3 rovnají v absolutní hodnotě(leží na kružnici se středem {0,0}). Ověřil jsem to pro mnoho čísel, které vylezlo z bruteforce a experimentálně to platí. Nakonec jsem přišel na to, že obr. 1 je speciální případ změny argumentu f2, f3 o p(resp. -p aby platilo, že f2 = êêê f3 ), a tedy, že stačí vzít libovolnou trojici čísel protáhnout ji Fourierem, změnit argument f2 o libovolné j, f3 o -j a přetáhnout zpět, pokud vzniknou celá čísla, máme řešení, ale v mnoha případech vzniknou čísla, která splňují (1) , (2) , ale nesplňují (3) , (4) , (5) . Díky tomu, že jsem všechny výpočty dělal v programu Mathematica, mohl jsem si je dovolit udělat obecně. Z Fourier[{a, b, c}] pak vydje: 8f1, f2, f3< = 9a + b + c, a + H-1L2ê3 b - H-1L1ê3 c, a - H-1L1ê3 b + H-1L2ê3 c=
aby se změnil argument komplexního čísla stačí ho vynásobit komplexní jednotkouHei j L s kýženým argumentem j . 9f1, f2 * ei j , f3 * e-i j = = 9a + b + c, Ia + H-1L2ê3 b - H-1L1ê3 cM ei j , Ia - H-1L1ê3 b + H-1L2ê3 cM e-i j =
Iverzním Fourierem a zjednodušením dostaneme:
1 è!!! 8d, e, f
b Sin@jD 2a 2b 2c 1 1 2 a Sin@jD d + e = ÅÅÅÅÅÅÅÅÅÅ + ÅÅÅÅÅÅÅÅÅÅ + ÅÅÅÅÅÅÅÅÅ + ÅÅÅÅÅ a Cos@jD + ÅÅÅÅÅ b Cos@jD - ÅÅÅÅÅ c Cos@jD + ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ è!!!ÅÅÅÅÅÅÅÅÅ - ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ è!!!ÅÅÅÅÅÅÅÅÅ 3 3 3 3 3 3 3 3
5
(6)
Author Name b Sin@jD a b c 1 1 2 a Sin@jD f = ÅÅÅÅÅ + ÅÅÅÅÅ + ÅÅÅÅÅ - ÅÅÅÅÅ a Cos@jD - ÅÅÅÅÅ b Cos@jD + ÅÅÅÅÅ c Cos@jD - ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ ÅÅÅÅÅÅÅÅÅ + ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ è!!! è!!!ÅÅÅÅÅÅÅÅÅ 3 3 3 3 3 3 3 3 2a a 2b d + e + f = ÅÅÅÅÅÅÅÅÅÅ + ÅÅÅÅÅ + ÅÅÅÅÅÅÅÅÅÅ + 3 3 3 1 2 2 ÅÅÅÅÅ b Cos@jD + ÅÅÅÅÅ c Cos@jD - ÅÅÅÅÅ 3 3 3
b 2c c 1 1 1 ÅÅÅÅÅ + ÅÅÅÅÅÅÅÅÅ + ÅÅÅÅÅ + ÅÅÅÅÅ a Cos@jD - ÅÅÅÅÅ a Cos@jD + ÅÅÅÅÅ b Cos@jD 3 3 3 3 3 3 a Sin@jD a Sin@jD b Sin@jD b Sin@jD c Cos@jD + ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ è!!!ÅÅÅÅÅÅÅÅÅ - ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ è!!!ÅÅÅÅÅÅÅÅÅ + ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ è!!!ÅÅÅÅÅÅÅÅÅ - ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ è!!!ÅÅÅÅÅÅÅÅÅ 3 3 3 3 d + e+ f =a+b+c
Tím jsem dokázal (1) .
1 d 2 + e2 + f 2 = ÅÅÅÅÅ I-2 b c I-1 + Cos@jD2 + Sin@jD2 M - 2 a Hb + cL I-1 + Cos@jD2 + Sin@jD2 M + 3 a2 I1 + 2 Cos@jD2 + 2 Sin@jD2 M + b2 I1 + 2 Cos@jD2 + 2 Sin@jD2 M + c2 I1 + 2 Cos@jD2 + 2 Sin@jD2 MM
Podle známé rovnosti Cos@jD2 + Sin@jD2 = 1 Tako dostáváme
1 d 2 + e2 + f 2 = ÅÅÅÅÅ I-2 b c H-1 + 1L - 2 a Hb + cL H-1 + 1L + a2 H1 + 2 * 1L + b2 H1 + 2 * 1L + c2 H1 + 2 * 1LM 3 1 d 2 + e2 + f 2 = ÅÅÅÅÅ I-2 b c 0 - 2 a Hb + cL 0 + a2 H1 + 2 * 1L + b2 H1 + 2 * 1L + c2 H1 + 2 * 1LM 3 1 d 2 + e2 + f 2 = ÅÅÅÅÅ I3 a2 + 3 b2 + 3 c2 M 3 d 2 + e2 + f 2 = a2 + b2 + c2
Tím jsem dokázal (2) .
4 Keygenerátor do (6) jsem dosadil p za j a získal následující rovnici
1 1 1 8d, e, f < = ; ÅÅÅÅÅ H-a + 2 b + 2 cL, ÅÅÅÅÅ H2 a - b + 2 cL, ÅÅÅÅÅ H2 a + 2 b - cL? 3 3 3
nechal jsem ji vyřešit v oboru celých čísel a s tímto výsledkem:
HC@1D » C@2D » C@3DL œ Integers && a == C@1D && b == C@2D && c == -C@1D - C@2D + 3 C@3D && d == -C@1D + 2 C@3D && e == -C@2D + 2 C@3D && f == C@1D + C@2D - C@3D
(7)
V programu náhodně generuji čísla C[1], C[2], C[3], dosazuji do (7) a výsledek hashuji ripem z 0x401A48, sice keygenerátor nenajde všechny možné kombinace čísel, ale najde jich zatraceně hodně.
6
Article Title
5 Přílohy //skript pro odstraneni balastu, JdaC!dT 2005 #include
static main(void) { auto ea, ea1; ea = 0x400000; while (ea < 0x403020) { ea1=FindBinary(ea, SEARCH_DOWN | SEARCH_NEXT | SEARCH_REGEX, "EB 01 ??"); if (ea1<ea) break; if (ea1 != BADADDR) { PatchByte(ea1, 0x90); PatchByte(ea1+1, 0x90); PatchByte(ea1+2, 0x90); ea = ea1; } } } Figure 1: cme17.idc
7