Jump to content

Konkurss 6 (closed)


0xDEAD BEEF
 Share

Recommended Posts

Es uzrakstīju programmu, lai atcerētos slepeno stringu. Diemžēl - es implementēju paroli, lai svešinieki netiek pie mana stringa un par nelaimi - es šo paroli aizmirsu! Man ļoti vajag atbildi, ko izvada programma!

 

Pievienotu atradīsiet manu programmu, kurai esmu aizmirsis paroli! (sorry par nokavēšanos ar konkursu!)

 

Balvu fonds:

* Pirmā vieta 10Ls

 

whiteCryption darbinieki piedalīties nedrīkst.

Balvu saņem pirmais dalībnieks, kurš iepostē pareizo atbildi (skat. zemāk atbildes formātu) (iepostēšanas laiks tiek uzskatīts pēdējais posta edit laiks).

 

Konkursa beigu termiņš - 29. aprīlis (2012), 23:59 LV laiks.

 

Atbilde ir jaiepostē šajā topikā šādā formā (lai citiem ari būtu interesanti):

 

"niks <atstarpe> SHA1(niks + atbilde)". + ir stringu kontaktenācija. Lūdzu lietojiet nikam ANSII lowercase un sha1 160 bitu variantu.

Piemēram: 0xdeadbeef 0f80010725b1a67fc11c43a787e04407698cf1bb (ja atbilde būtu bijusi "abcdefghijklmnop").

 

Kā vienmēr - uzvarētājs sūta man (PM) savu vārdu un uzvardu, kā arī p.k. (obligāts lauks DNB bankā) un bankas konta numuru, lai saņemtu balvu!

 

--- KONKURSS IR NOSLĒDZIES!!! APSVEICAM vdl AR UZVARU! STAY TUNED! RĪT NĀKAMAIS KONKURSS (12:00 LV LAIKS) ---

 

Veiksmi,

Beefs

Konkurss6.zip

Labots - 0xDEAD BEEF
Link to comment
Share on other sites

Vilx-, neviens jau nespiež pūlēties ;) Var jau arī iziet dārzā saplūkt piecīšus.

Ir arī te pāris frukti, kas salīdzinoši īsā laikā var tikt galā ar šāda tipa uzdevumiem.

Link to comment
Share on other sites

Mēģināts nav zaudēts.

 

Principā ar studijas debugeri šitajam pietiek.

Link to comment
Share on other sites

Леший

Nu varu pārmest to, ka ne visi, kas prot debugot x86, sēž uz vinduļa. Es piemēram darbā sēžu uz ubuntas, un tur debugošanas/dekompilēšanas iespējas ir stipri ierobežotās.

Būs vien jāprovē no mājām.

Bet šeit ir vismaz zināms, kas jādarā, ne jau tā, ka 3. konkursā ;)

Pie reizes, varbūt kāds zin, kāpēc man, mēģinot treisot ar gdb, izmet

Shared library architecture i386 is not compatible with target architecture i386:x86-64.

Mēģināju mainīt arhitektūru - tas pats.

Labots - Леший
Link to comment
Share on other sites

Nu, moš, bet es kaut kā šaubītos. IMHO mūsdienās šādas prasmes ir lieeeels retums. :unsure:

 

Btw - moš kaut ko atceries par pašu paroli? Garumu, izmantotos simbolus, utml? :)

Link to comment
Share on other sites

Vilx-, vienā no iepriekšējiem postiem redzēju komentāru no vdl - esmu vairāk kā pārliecināts, ka šāds uzdevums viņam nevarētu sagādāt pārāk lielas galvassāpes. Arī bubu gan jau ka tiktu galā. Par citiem nezinu :D

 

Starp citu, ja prasmju var, neviens neliedz tās iegūt. Un re', te tev vēl par to piedāvā 10 Ls :D

Link to comment
Share on other sites

:p

 

Darīt itkā nebūtu ko. Vispār, ja godīgi, es jau sen esmu gribējis apgūt šo prasmi (un pie reizes saprast, kā tad "tur apakšā" viss strādā), bet nekad nav bijis laika. Un es arī neesmu vēl atradis tutoriāli, kas apstāstītu visas mūsdienu CPU nianses. Ir visādi tutoriāļi par CPU aptuveni līdz Pentiumam (kas, protams, arī ir vērtīgas zināšanas, jo pamati jau nav mainījušies), bet svaigākas lietas gan nav manītas. :(

Link to comment
Share on other sites

0xDEAD BEEF

Gan parole gan atbilde satur [a-z][A-Z][0-9] simbolus. Garums starp 8 un 16 (ieskaitot).

Beefs

Link to comment
Share on other sites

versatile

Pozitīvi :) Tēma un fruktu pieminēšana uzsita nostaļģiju (kā šodien atceros JS LV Keygenu), aš iesitu pārlūkā adresi, i voila... http://3priedez.net/log/

 

 

/offtopic off

Labots - versatile
Link to comment
Share on other sites

0xDEAD BEEF

Apsveicam! VDL atbild pareizi un uzvar konkursa!!! :)

Beefs

Labots - 0xDEAD BEEF
Link to comment
Share on other sites

Kāda jēga rīkot konkursus cilvēkiem, kas to jau prot darīt..... Vienkāršāk būtu uzdot jautājumu, kas grib 10ls par atkošanu. Konkurss ir godīgs, ja to var izdarīt +- visi, ja ir gribēšana. Bet tagad sanāk kā jau "binary" minēja tie, kas ar to nodarbojas nav nekādu problēmu, lai gan man liekas uzvarētājs iekļaujas : " whiteCryption darbinieki piedalīties nedrīkst.", jo pirms uzdevuma iesniegšanas jau bija zināms, ka šis cilvēks to var...... Hmm pastrādāju kādu 1.5h pie šī uzdevuma bez priekšzināšanām lēkāju pa OP code adresēm un meklēju mainīgo, bet nepaspēju, jo nekad to nebiju darījis. Īstenībā nav tik sarežģīti.

Link to comment
Share on other sites

kazarma, nē, diemžēl uzvarētājs nestrādā whiteCryption (lai arī kā mums to gribētos) ;)

 

Par to "konkurss ir godīgs, ja to var izdarīt ± visi" - paskaties kādreiz TV, tur ir čupa visādu konkursu, kur cilvēkiem ir jādzied, jādejo, jāatbild uz dažādiem jautājumiem utt utjp - katram konkursam ir sava ievirze. Cilvēks, kurš neprot dziedāt, neuzvarēs dziedāšanas konkursā neatkarīgi no tā, cik ļoti viņam to gribas. Tāpat cilvēks, kam švaki ar dažādu faktu pārzināšanu, nez vai izcels miljonu iekš "gribi būt miljonārs". Tas pats arī te - konkursam ir konkrēta ievirze (kuru diktē 0xDEAD BEEF), un uzvarēt var jebkurš, kam ir kaut kādas zināšanas konkrētajā jomā.

Link to comment
Share on other sites

Nē es jau nestrīdos un nauda arī nav vajadzīga, sporta pēc gribēju pamēģināt. Bet par to vai cilvēks ir "whiteCryption" vai nav varētu vēl pastrīdēties, bet, lai jau tiek godīgi iegūta uzvara :D VDL apsveicu.

Labots - kazarma
Link to comment
Share on other sites

Леший

Vispār, man ir priekšlikums Beefam: veidot tādās kā konkursu sērijas, tas ir, katrs konkurss dod hintu nākamajam konkursam, un neizpildot iepriekšējo konkursu, nevarēs izpildīt arī nākamo posmu. Ar to atkristu problēma ar darbu, jo nebūs svarīgi, cik ātri tu vari atrast risinājumu - lasi nebūs obligāti jāpilda darba laikā. Un arī, varēs pārbaudīt dažādus cilvēka skillus, ja protams, paši posmi būs dažādi.

Link to comment
Share on other sites

0xDEAD BEEF

kazarma - tu vari droši turpināt risināt šo uzdevumu. Kaut arī balvas ir beigušās, tomēr tu vari būt ortrais, kurš šito atrisina. Atbildi vari pats pārbaudīt pret vdl-a hašu. Ļešij - laba toma par konkursu sēriju - es par to padomāšu! :)

Beefs

Link to comment
Share on other sites

nu re, nedaudz papētīju doto failu, un atliku šo uz piektdienu, kad to turpinātu pēc eksāmena, bet te jau atbilde, lai nu kā - apsveicu! :)

Link to comment
Share on other sites

naziic, neviens jau neliedz piektdien turpināt ;) Ja izdosies - būs gan pašam prieks, gan neliela pieredze, kas vēlāk var noderēt.

Link to comment
Share on other sites

Intereses pēc, moš vdl varētu te iepostēt, kā viņš atrisināja? Iekš {spoiler} tagiem, protams. :)

Link to comment
Share on other sites

kazarma, tas konkurs jau nav konkursa pēc ar balvām. Beefam ir savi mēŗķi, kāpēc viņš to dara, un arī konkursa uzdevumi nebūs par dabu, politiku, sportu utt.

Link to comment
Share on other sites

versatile

Nu, teoretizējot (un no nelielas praktiskas pieredzes no tiem laikiem, kad PALM aplikācijas meģināju "modificēt") - atrodam vietu, kur notiek pārbaude uz paroles pareizumu, un samainam vietām baitus, kas norāda kas jādara tālāk. Nokompilējam, izpildām, ievadām jebko, un voila... Tas pie noteikuma, ka parole nav izmantota lai šifrētu to info.

Kā jau teicu, tikai teoretizēšana, un konkrēto piemēru neesmu skatījies un gan jau nesanāktu. Uz PALMiem gan šur tur strādāja eleganti :)

Link to comment
Share on other sites

0xDEAD BEEF

Nu idejiski tieši tas arī ir jādara. Bēda tāda, ka tas ir optimizēts kods ar inlainotām funkcijām un statiski ielinkotu scanf/printf. Protams, ja tev ir labs dekompileris, tad tas ļoti palīdz. BTW - teksti šajā uzdevumā nav plainā, bet ir xoroti ar paroli, lai nebūtu triviāli paskatīties stringus .exe failā.

Beefs

Link to comment
Share on other sites

Man arī šis uzdevums ieinteresēja, dabūju sev IDA un sāku pētīt kā tas izskatās asamblerī. Es teiktu, ka šo uzdevumu atkostu vairākums vietējo, ja dotu vairāk laika.

atbilde: austere 7071EAD4DB83D9C6CF9C63E7CAC6D04F91837457

Link to comment
Share on other sites

versatile

teksti xoroti? Tad parole sanāk ka glabājas xorota pati ar sevi vai kā?! :o

Link to comment
Share on other sites

0xDEAD BEEF

Pareizi, austere! :)

versatile - tieši tā! Ja teksti glabātos parasti, prot

static char answer[] = "secret_answer";
static char question[] = "Ievadiet paroli:";

tad šie simboli būtu viegli atrodami .exe failā, vienkārši to atverot ar notepad un pameklējot stringus. Tādēļ es izmantoju viltību -

static unsigned char answer[] = { 13, 5, 65, .... };
static unsigned char random[] = { 66, 86, 211, ...};

 

kad es iezvadu tekstu, es uzrakstīju speciālu funkciju, kura pa vienam simbolam ņem no (piemēram, answer) un taisa xor ar random, tad to casto uz char un izvada ar printf. Un attiecīgi paroles salīdzināšanai arī funkcija, kura ievadīto stringu pa simbolam salīdzina ar parole ^ random. (tiesa, tajā funkcijā es ielaidu super-tupu kļūdu... ;) )

 

Beefs

Link to comment
Share on other sites

Man patika atbilde "tieši tā" uz jautājumu "parole glabājas xorota pati ar sevi" :D Ķip "abc" xor "abc" jeb vienkārši {0, 0, 0, 0} :)

Labots - binary
Link to comment
Share on other sites

jup, es arī iefanoju, par ideju glabāt datus xorotus pašus ar sevi. labi kompresēsies. :) write only gan :D

 

IDA gan baigi dārgs, joprojām vēl neesmu saņēmies nopirkt.

Link to comment
Share on other sites

0xDEAD BEEF

Atrisini šito pašu, binary! :)

Es zinu, ka Tu jau esi mājās un atbildi nezini! ;)

Beefs

Edit: es tev rīt par to atnesīšu kūku (es zinu, ka tu padalīsies)

Edit2: nope! SOORRYY! Pārdomāju! Es atcerējos, ka tu zini čīītu!

Labots - 0xDEAD BEEF
Link to comment
Share on other sites

rofl :D nu pat ja es gribētu kūku, man šodien ir ko darīt - jāiemēģina jauno lodalvu :D

Link to comment
Share on other sites

Nebiju vēl lasījis ko DeadBeef augstāk bija sarakstījis par xor'ēšanu, pamēģināju atrisināt uzdevumu izmantojot pliku Visual Studio (sākumā gribēju tikai statiski -dissasemblēt izmantojot hiew32), bet priekš tā slikums un negribējās laiku tērēt.

 

Lūk risinājums (spolieris, jo iekļauj atbildes tekstu):

 

Palaidu Konkurss6.exe

Palaidu Visual Studiju

Izvēlējos Debug->Attach to Process

Izvēlējos sarkstā Konkurss6

Uzspiedu Debug->Break All

Call stekā atradu pirmo rindiņu no augšas, kura saka "Konkurss6.exe!..." un uzklikškināju dubultklikšķi

Dissasemblera logā (Alt+8) uzliku breikpointu uz iezīmētās rindiņas "test eax,eax"

Uzspiedu F5 lai darbojas tālāk

Ierakstīju kautkādu krapu konsolē: abcabc

Un nospiedu Enter, studija apstājās uz breikpointa

Spaidīju Shift+F11 (11 reizes) kamēr tiku līdz kodam, kas izskatās šādi:

011D10F0 0F B6 C3             movzx       eax,bl  
011D10F3 0F BE 88 D5 DE 1D 01 movsx       ecx,byte ptr [eax+11DDED5h]  
011D10FA 0F BE 90 04 DF 1D 01 movsx       edx,byte ptr [eax+11DDF04h]  
011D1101 33 CA                xor         ecx,edx  
011D1103 51                   push        ecx  
011D1104 68 A0 B9 1D 01       push        11DB9A0h  
011D1109 E8 D5 00 00 00       call        011D11E3  
011D110E FE C3                inc         bl  
011D1110 83 C4 08             add         esp,8  
011D1113 3A 1D D4 DE 1D 01    cmp         bl,byte ptr ds:[11DDED4h]  
011D1119 72 D5                jb          011D10F0  

(Adreses jums būs citas, jo ļaunais Reinis uzbūvējis failu ar randomizētu bāzes adresi)

Bet būtība tāda, ka te ir kautkāds cikls ar kautkādu xor'ēšanu un kautkādu funkcijas izsakumu, kurš izvada vienu simbolu (to var redzēt paspaidot F11 un redzot, ka pēc call izsaukuma izvadās viens simbols).

Paskatoties memory logā (Alt+6) adresi 11DB9A0h var redzēt, ka tas ir "%c". Tātad ar lielu varbūtību 011D11E3 ir printf funkcija.

ecx reģistrs ir čara vērtība.

ecx reģistru dabū saxor'ējot divus masīva elementus - 11DDED5 un 11DDF04, kuri ir garumā 0x11=17 (to var redzēt paskatoties baitu adresē 11DDED4

"Nepareiza parole!" - tas ir precīzi 17 baiti. Forši.

 

Skatamies kodu augstāk:

011D10DF 38 1D D4 DE 1D 01    cmp         byte ptr ds:[11DDED4h],bl  
011D10E5 76 34                jbe         011D111B  
011D10E7 EB 07                jmp         011D10F0  

 

Tātad te notiek sekojoša lieta:

if (kautkāds baits >= bl) goto 011D111B else izvadīt "Nepareiza parole!"

Paskatamies, kur ir 0x11D10F0 - tieši pēc izvadīt "Nepareiza parole!"

Intuīcija saka, ka 011D111B visdrīzāk ir programmas beigas. Tāpēc jāskatās vēl augstāk

 

Pieņemot, ka C kods ticis rakstīts stilā if (kautkas) { ... } else if (kautkas2) { ...} esam tuvu risinājumam.

Ok, skatamies augstāk:

011D10B0 0F B6 C3             movzx       eax,bl  
011D10B3 0F BE 88 E9 DE 1D 01 movsx       ecx,byte ptr [eax+11DDEE9h]  
011D10BA 0F BE 90 04 DF 1D 01 movsx       edx,byte ptr [eax+11DDF04h]  
011D10C1 33 CA                xor         ecx,edx  
011D10C3 51                   push        ecx  
011D10C4 68 A0 B9 1D 01       push        11DB9A0h  
011D10C9 E8 15 01 00 00       call        011D11E3  
011D10CE FE C3                inc         bl  
011D10D0 83 C4 08             add         esp,8  
011D10D3 3A 1D E8 DE 1D 01    cmp         bl,byte ptr ds:[11DDEE8h]  
011D10D9 72 D5                jb          011D10B0  

 

Awesome, kautkāds cikls, kas atkal xor'ē divus masīvus. Un tas atkal lieto printf (011D11E3) un izvada pa vienam čaram (11DB9A0h = "%c")

 

Paskatamies memory logā (Alt+6) garumu, kas ir adresē 11DDEE8h = 0x1b = 27

Paskatamies memory logā 27 baitus no 11DDEE9h = e0 49 60 2d ef c7 82 62 18 a7 eb cf fe e4 68 b7 d3 88 a0 85 00 08 95 1c c6 b2 49

Paskatamies memory logā 27 baitus no 11DDF04h = a1 3d 02 44 83 a3 e7 42 71 d5 cb bc 88 b7 0b c5 e0 c6 99 e7 70 3d a5 2d a4 82 0b

 

Saxor'ējam abus (pitonā):

a = "e0 49 60 2d ef c7 82 62 18 a7 eb cf fe e4 68 b7 d3 88 a0 85 00 08 95 1c c6 b2 49".replace(" ", "").decode("hex")
b = "a1 3d 02 44 83 a3 e7 42 71 d5 cb bc 88 b7 0b c5 e0 c6 99 e7 70 3d a5 2d a4 82 0b".replace(" ", "").decode("hex")
c = [ord(x)^ord(y) for x,y in zip(a,b)]
print "".join(map(chr, c))

 

Izpildam kodu un iegūstam tekstu: Atbilde ir svScr3N9bp501b0B

 

Awesome!! Pārbaudam ar vdl niku (atkal Pitons):

import hashlib
h = hashlib.new("sha1")
h.update("vdlsvScr3N9bp501b0B")
print h.hexdigest()

izvada "df2c60748b3afeca1db8df5b8f1e8980e2ba50ed" - korekti!

 

Kūl. i nemaz nevajag domāt kas tur par kodu un ko tur dara, vienk uz dullo tikai pamēģināju saxor'ēt to, ko Reinis xorē.

 

 

 

Aizņemtais laiks ~20min.

 

Tīri teorētiski, nemaz Windows šitam nevajag. To visu vielgi var atrisināt uz Linux izmantojot objdump no Mingw.

Labots - bubu
  • Patīk 1
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...