Jump to content

0_o

Members
  • Posts

    8
  • Joined

  • Last visited

    Never

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

0_o's Achievements

Newbie

Newbie (1/14)

10

Reputation

  1. In acest tutorial va voi explica cum sa unpack-uiti un program pack-uit cu AsPack 2.xx, pentru a-l aduce in forma originala, daca vreti sa modificati ceva, sau vizualiza string-uri sau bitmap-uri din executabilul respectiv cu un program gen Resource Hacker sau orice altceva doriti sa faceti. Utilitare folosite: OllyDbg (debugger & dissasembler) si Import Reconstructor (va fi nevoie sa re refaca / corecteze Import Table-u [Tabela cu importuri], deoarece majoritatea pack-erelor fac Import Table-ul inutilizabil [se poate face si manual insa este mult mai mult de lucru]) Deschidem fisierul pack-uit cu OllyDbg (Un mesaj ne va avertiza ca executabilul este pack-uit). Vom vedea ca prima intrusctiune este PUSHAD. Ce face PUSHAD asta? Well... `salveaza`/baga in stack (locul unde se tin numere/adrese/parametrii temporar) toti registrii (EAX, EBX, ECX, EDX, etc). De ce face asta? Pentru ca acum urmeaza secventa de cod (oarecum mare ) care unpack-uieste programul, iar valorile continute de unii registrii vor fi necesare la rularea propriu-zisa a programului, si deci, trebuie salvate, pentru ca mai tarziu sa ia din nou valorile care le-au avut la inceput, adica in momentul apelarii functiei PUSHAD. Insa apelarea functiei PUSHAD modifica implicit si registrul ESP - Extended Stack Pointer - Point-eaza/arata catre varful stack-ului (in cazul nostru arata exact locul unde au fost salvati registrii EAX, EBX, ECX, etc). Sa continuam. Deci prima comanda este PUSHAD. Facem un Step Over (Fb) si ajungem la a 2-a instructiune, si anume un CALL XXXXXXXX. In momentul acesta ne uitam la registrul ESP si vedem ca este scris cu rosu, deci s-a modificat, deci ce am spus mai inainte s-a adeverit. Acum facem click dreapta pe el (mai exact pe valoarea lui) si dam pe Follow in dump. Acum, in `sectiunea` de sub dissasembler, adica DUMP, ne este aratat locul a carui adresa este valoarea lui ESP (deoarece am dat Follow in dump, adica sa ne duca la adresa respectiva). Selectam primul caracter / Click dreapta / Breakpoint / Hardware, on access / Byte. Si am pus un breakpoint aici. Ce inseamna asta? Ca atunci cand se va accesa `partea` aceasta, se va opri rularea programului. Insa de ce breakpoint aici? Pentru ca atunci cand secventa de unpack-uit se termina, ea se incheie cu un POPAD. Ce face POPAD? Ia ultimele valori din stack si le baga inapoi in registrii EAX, EBX..etc. In cazul nostru se vor baga valorile initiale, deoarece tot ce s-a stocat in stack pe parcursul secventei de unpack-uire, s-a scos/folosit si deci avem valorile initiale ale registrelor, si acum le bagam inapoi in registrii. Insa ce legatura are POPAD-ul asta cu breakpoint-ul nostru? Pai... atunci cand se cheama POPAD se citestc valori din stack, si printre astea se citeste si valoarea la care am pus noi breakpoint, si se opreste executia programului exact la sfarsitul secventei de unpack-uire. Acum suntem la un JNZ XXXXXXXX (Jump Not Equal / Jump Not Zero), facem Step Over sa trecem la urmatoarea instructiune care este un PUSH. PUSH-ul acesta stocheaza o valoare in stack. Insa nu orice valoare, ci OEP (Originally Entry Point), adica locul exact de unde incepe programul adevarat/unpackuit. Apoi se cheama un RETN folosit pentru a iesi din secventa de unpack-uire si intoarcerea la adresa care tocmai a fost PUSH-uita/stocata in stack, mai exact locul de unde incepe programul adevarat/unpackuit. Ok, suntem la locul unde incepe programul unpack-uit. Uitati-va la offestul/adresa la care sunteti acum [ex: 454060], care reprezinta OEP (Original Entry Point). Acum, dati ALT + M, si la coloana Owner cautati numele programului pe care il unpack-uiti. Veti vedea ca e de mai multe ori, pentru fiecare sectiune in parte. Dublu Click pe sectiunea PE Header. Va aparea o fereastra, in care dati putin in jos, pana unde incepe alte scris-uri, si cautati Imagebase = xxxxxxxx. De obicei xxxxxx-ul ala e 400.000. Acum.. avand OEP-ul scris pe o foaie sau altundeva, deschideti aplicatia Calculator si efectuati urmatoarea diferenta (in modul HEX): OEP - Imagebase. In cazul meu: 454060 - 400000 si o sa obtineti OEP-ul fara Imagebase (o sa ne trebuiasca la reconstruirea tabelei de import-uri). Notati rezultatul asta undeva. La mine este 54060. Acum trebuie sa salvam asta intr-un fisier nou si avem programul unpack-uit. Cum facem asta? Pai OllyDbg normal are un Plugin care face asta, si anume OllyDump (meniu: Plugins / OllyDump / Dump debugged process). Lasati totul asa cum e si dati DUMP si alegeti un nume noului fisier/executabil creat. Acum, mai mult ca sigur ca nu va merge sa rulati programul nou salvat, veti primi o eroare de genul: The procedure entry point xxxxxxx could not be located in the dynamic link library xxxxxxx.dll. Eroarea asta apare deoarece, cum ziceam la inceput, packer-ul a facut Import Table-ul inutilizabil. Ca sa il refacem folosim Import Reconstructor Deschidem Import Reconstructor (NU inchideti OllyDbg) si selectati Attach to an Active Process, iar din lista selectati programul pe care il unpack-uiti. (El ruleaza deja, deoarece OllyDbg l-a creat pentru ca il executa pas cu pas). Acum, uitati-va acolo unde scrie IAT Infos Needed, la OEP si introduceti ultimul rezultat care l-ati notat pe foaie sau nush unde si il scrieti aici, apoi apasati pe butonul IAT AutoSearch, ar trebui sa va apara o casuta cu Found something la titlu si nush ce mesaj. Acum apasati pe butonul Get Imports, apoi pe Auto Trace, iar in final: Fix Dump, si dati pe programul pe care l-ati salvat mai inainte cu OllyDump. Si ... voila. Merge programul unpack-uit. by Schoker
  2. program C , sursa mai jos , pentru incepatori by !_30 ?? int main() {     int sec,ore,minute,secunde;     printf("NUmarul de secunde : n");         scanf("%d",&secunde); ore=0; while (secunde>0) {     if ((secunde-3600)>=0)          {++ore;secunde=secunde-3600;}     else         {break;}}         printf("NUmarul de ore este : %dn ",ore);         minute=0; while (secunde>0) {     if((secunde-60)>=0)         {++minute;secunde=secunde-60;}             else             {break;}}             printf("NUmarul de minute este : %d n",minute);            printf("NUmarul de secunde este : %d n",secunde);                       }
  3. http://www.gusperez.com/downloads/bin/uptime2k.zip
  4. Injectii Injectari. Toate sunt la moda. Peste tot se gasesc tutoriale de "SQL Injection", "E-Mail Injection", "PHP Injection"... inca nu am vazut nici un tutorial de "Frame Injection" pe forumurile de aici asa ca m-am apucat sa fac eu unu. Ce inseamna Form Injection ? Form Injection e o metoda de atac ca oricare alta. Este motivul pentru care Yahoo! Si-a schimbat designul vechi (tineti minte varianta cu fram-uri ?). Este motivul pentru care multi ISP nu ofera hosting pentru paginile care contin frame-uri, este motivul pentru care MSIE e luat la suturi toata ziua si Opera ridicat in slavi Cum functioneaza Form Injection ? Ca sa intelegeti functionarea am pregatit cateva pagini HTML simple. Pun mai jos codul corespunzator fiecarei pagini: index.html <html><head></head> <frameset border="0" frameborder="0" framespacing="0" rows="150,*">   <frame name="frame1" src="frame1.html">   <frame name="frame2" src="frame2.html"> </frameset> </html> frame1.html <html><head></head> <body bgcolor="#CCCCCC"> Frame1 </body> </html> frame2.html <html><head></head> <body bgcolor="#999999"> Frame2 </body></html> frame3.html <html><head></head> <body bgcolor="#FF0000"> Frame3 (cadru injectat) </body></html> inj.html <html><head></head> <body> [url="frame3.html"]Click aici ![/url] </body></html> Nimic spectaculos pana aici... revenind la functionalitate. Sa presupunem ca vecinul X viziteaza zilnic pagina Y care e construita cu cadre (frame-uri) si va intereseaza niste date care le stie vecinul X (conturi de mail sau alte gainarii). Am presupus ca pagina X este index.html prezentat mai sus care incarca in pagina 2 cadre si anume frame1.html si frame2.html. Daca deschideti index.html veti vedea ca cele doua pagini sunt incluse. OK, now what ? Uploadam inj.html si frame3.html undeva unde avem un cont si il convingem pe vecinul X sa dea click pe adresa fisierului inj.html. Fisierul inj.html are un link catre frame3.html, link care se deschide ( target= ) in frame2.html. Singurul loc in care este declarat frame2 este pagina Y care o viziteaza vecinul (in cazul nostru index.html). Daca dati click pe link-ul din pagina inj.html veti vedea ca Frame2.html care normal e pe un alt server se deschide in cadrul cu numele frame2 (adica, al doilea cadru din index.html). Simplu, nu ? Mai departe totul tine de imaginatie. Modificati frame3.html sa arate ca o pagina de pe site-ul Y in care se cere user si parola (scam), modificati inj.html sa deschida pagina automat, in background (cu javascript) si, bineinteles, puneti-i un nume mai putin sugestiv Nota De mentionat ca tehnica NU functioneaza pe orice browser. Functioneaza pe aproape toate variantele de M$ Internet Explorer, nu functioneaza pe Opera si... testati si voi si spuneti-mi pe ce l-ati facut sa mearga by operabilu
  5. Stiati ca un calculator nu stie face decat adunari ? Nu stie face nici scaderi, nici inmultiri, nici impartiri. Atunci cum se descurca ? Cu scaderile, folosind operatiile in cod complementar. De inmultiri n-are nevoie (veti vedea ulterior de ce), iar impartirile sunt o adevarata problema. Aici se va trata codul complementar. Pentru a intelege mai usor principiul, se va da un exemplu in numere zecimale, care insa este tare "handicapat" fata de ce se poate face in binar (daca inca nu stiti de ce, veti intelege intr-o postare ulterioara). Fie un calculator zecimal cu registre care pot stoca cate doua cifre, deci valorile reprezentabile sunt 00 01 02 03 ... 09 10 11 12 ... 20 21 ... 98 99, adica in total 100 de valori. Aceste valori vor fi considerate coduri. Intrucat exista 100 de coduri, acestea pot fi asociate cu 100 de numere intregi. Pentru a putea reprezenta si numerele negative (avem nevoie de ele, nu ?), codurile le distribuim in modul urmator (nu e la voia noastra  ): - codul 00 il alocam numarului 0; - codurile 01 ... 49 le alocam numerelor 1 ... 49; - codurile 50 ... 99 le alocam numerelor -50 ... -1 astfel: Numar -50 -49 ... -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6 ... 48 49 Cod  50 51 ... 94 95 96 97 98 99 00 01 02 03 04 05 06 ... 48 49 Si acum sa ne jucam. Cand avem de facut o operatie, inlocuim numarul cu codul, apoi facem operatiile cu codurile si convertim rezultatul in numar. Remember: calculatorul nostru are doar doua cifre zecimale. 1. Adunarea a doua numere pozitive, rezultat pozitiv. Exemplu:   2 + 3 = 02 + 03 = 05 = 5 (frumos, adevarat si la mintea cocosului  ) 2. Scaderea este inlocuita cu adunarea cu un numar negativ. Exemple:   5 - 3 = 5 + (-3) = 05 + 97 = 102 (1 din fata nu poate fi stocat si se pierde) = 2 (!! in pofida pierderii rezultatul este, totusi, corect ! )   3 - 5 = 3 + (-5) = 03 + 95 = 98 = -2 (mda, de data asta nu a fost nicio "scamatorie", iar rezultatul este corect. ) 3. Inmultirea numerelor pozitive si negative. Exemple:   2 x 3 = 02 x 03 = 06 = 6 (deocamdata am revenit "pe pamant" )   2 x (-3) = 02 x 97 = 194 (1 din fata se pierde) = -6 (iarasi pierderea aia ! rezultatul insa este... )   (-2) x (-3) = 98 x 97 = 9506 (95 din fata se pierde !!) = 6 (wtf, iar s-a facut ceva "pe sub mana", si totusi... ) 4. Impartirea se face prin incercari si erori (dar cu un algoritm eficient). Trebuie cunoscut ordinul de marime al catului (nu e greu de determinat), se inmulteste impartitorul cu catul si se compara cu deinmultitul. De aia operatia de impartire a numerelor intregi este mult mai lunga. Sii... veti spune, bine dar 30 + 40 = 30 + 40 = 70 = -30 (rezultat wrong, wtf ? ) Ei, deoarece numarul maxim care are cod este 49, aici apare depasirea si se semnaleaza o eroare (calculatorul nu poate face operatia). Cum isi da seama un calculator ca este o depasire ? In calculatorul zecimal prezentat nu poate, dar intrunul binar da. Cum, se va explica intro postare ulterioara. by suri
  6. 1 BIT :     |0| ---Cea mai mica bucata de informatie. Ori e 1, ori e 0. Daca ii pui unul langa altul, obtii un numar in baza 2. (1=1, 10=2, 11=3, 100=4, 101=5, … ) ------------------------------------------------------------------------------------------ 1 NIBBLE:  |0000| 4 BITi ---NIBBLE-ul este o jumatate de BYTE sau 4 BITI. Valoarea lui maxima este 15 (1111=15). Nu din intamplare, HEXAZECIMAL-ul, un sistem de numere in baza 16 are o valoare maxima de 15, care este reprezentata de litera F. `Cifrele` din HEX sunt (in ordine crescatoare): 0123456789ABCDEF Notarea standard pentru HEX este un 0 urmat de numarul in HEX care la randul lui este urmat de un h . De exemplu: 0FFh = 255 decimal. ------------------------------------------------------------------------------------------ 1 BYTE    |00000000| 2 NIBBLE 8 BITi ---BYTE-ul (octetul) este `bucata` standard de informatie. Un BYTE are o valoare maxima de 0FFh (=255 decimal) pentru ca un BYTE reprezinta de fapt 2 NIBBLE, iar reprezentarea hexazecimala consta in 2 `cifre` hexazecimale (054h, 0F4h, 0FFh) ------------------------------------------------------------------------------------------ 1 WORD  |0000000000000000| 2 BYTEs 4 NIBBLE 16 BITi ---WORD-ul reprezinta defapt 2 BYTES. Valoarea maxima a WORD-ului este 0FFFFh (=65.535 decimal). Deoarece 1 WORD sunt defapt 4 NIBBLE, reprezentarea hexazecimala consta in 4 `cifre` hexazecimale. ------------------------------------------------------------------------------------------ 1 DWORD |00000000000000000000000000000000| 2 WORDs 4 BYTEs 8 NIBBLE 32 BITi ---Un DWORD (Double Word – Word Dublu) reprezinta 2 WORDs, de unde si numele de Dublu-Word. Valoarea maxima este 0FFFFFFFFh (8 NIBBLE => 8 de `F`) (=4.294.967.295 decimal). ------------------------------------------------------------------------------------------ 1 KILOBYTE |0 x 8192| 256 DWORDs 512 WORDs 1024 BYTEs 2048 NIBBLE 8192 BITi ---Cu totii ati auzit de KILOBYTE, insa in ciuda numelui sau (KILO… nu reprezinta 1000 de BYTEs ci 1024 BYTES ------------------------------------------------------------------------------------------ Urmeaza apoi MEGABYTE, GIGABYTE, TERABYTE, PETABYTE, ETABYTE. !!! ATENTIE !!!: Nici acestea nu cresc din mie in mie cum erati obisnuiti de la scoala cu metru, litru, …. Acestea cresc din 1024 in 1024, astfel 1 ETABYE NU reprezinta 1.000.000.000.000.000.000 BYTEs ci 1.152.921.504.606.846.976 BYTEs. (Inspirat din VLA's Assembly Tutorial) ---=== by Shoker ===---
  7. Super forumul!! ce sa mai spun.Pana acuma nu am gasit unul mai mare in romania decat asta! BRAVO ! si tineti-o tot asa! ios 0_o si am 19 ani...facultatea bb (cluj) !
×
×
  • Create New...