Corso newbies numero 11

Data

by "IronSpark"

 

25/09/2002

UIC's Home Page

Published by Quequero


Andregeddon un esempio di .i.a

:)

Qualche mio eventuale commento sul tutorial ..... alllora .... il tutorial è pieno zeppo di cazzate .... più si scende nei particolare più la mia lameraggine aumenta!!! :)))))

Ok quella e' stata l'invasione di iron :) cmq bravo il problema e' che finche' userai frontpage express 2.0 mi darai SEMPRE tutorial S-formattati :)))

Quequero un esempio di ..... mmmmm..... ma non mi viene in mente nulla :P

....

Home page: non c è!
E-mail: parkistan@hotmail.com
irc.azzurra.org   #crack-it , #reversing
 

....

Difficoltà

(x)NewBies ( )Intermedio ( )Avanzato ( )Master

 

Il tutorial è molto semplice e si presenta bene per chi non sa niente o quasi di asm o reversing . ho cercato di essere più semplice possibile, mica come il sommo Que che quando spiega non lo capisce nessuno :PPP ..... Que lo sai che ti Amo!!!!! :DD


Soluzione al corso numero 11 per newbie scritto da Andregeddonzolo
Written by Ironspark

Introduzione

Di nuovoooooooooo ...... altre parole su sto cavolo di tutorialllllll ..... mamma mia che pallozze!!!! Diciamo che non ho nessun altro commento da fare!!!:))))

Tools usati

Semplicemente IDA

URL o FTP del programma

Il seguente crackme lo trivate sul sito stesso nella sezione tutorial per newbie!!!

Notizie sul programma

Che notizie darvi è un corso molto banana ... per studenti banana .... a cui non piacciono le banane ma come me preferiscono le farfalle!!!! Que non mi censurare!! :)) Figurati, non cesuro mai io ;p a parte quelle sette pagine che hai scritto e che ho appena levato hihih :>>> skerzo NdQue

Essay

 

Ciao ragazzi, benvenuti al mio primo tutorial!!! a dir la verità ne avevo fatto un altro ma una volta formattando l' ho cancellato!!!:(( ...... non cominciate con dire che sono leimmmmmmm... bastardiiiiii ... vi ho sentito pronunciare quella parola!!!! :)). Siamo giunti a questo tutorial per cercare di REVERSARE e non craccare questo non so se semplice programmino scritto dall' ormai GRANDE : ANDREAGEDDON!!!L' uomo che ha sopportato e sopporta tutt ora le mie domande leim e le mie continue seghe mentali su cose inutili!!!! ANDREA se fossi donna ti avrei già ......  vabbè lassamo sta!!! Questo programmillo sembra piuttosto semplice e a quanto dice Andrea serve per imparare ad usare meglio il nostro disassemblatore preferito :IDA!!! (sicuramente que metterà qualche asterisco sul nome del programma:))). Noi lo reverseremo con molta calma e nella più assoluta semplicità!! Partiamo........wrooooooooommmmmmmmm ..... eccoci in viaggio!!! (n.d.r. Ironspark basta con le cazzate!! Che hai fumato oggi? :>>> NdQue) Allora prima di tutto dovete avere IDA se non non facciamo niente! se non lo avete sparatevi:))... scherzo cercate e cercate in rete qualche versione di sicuro la ritroverete (mi raccomando www.google.com rulez!!!). aprite il file e disassemblatelo (ora pensavo ma perchè fare sto prog per imparare ad usare IDA se ci sono i tut del Que alla UIC????? Boh forse perchè sono fatti dal Que e andrea non voleva sentirsi meno:PPPP). Riprendiamo,  avete disassemblato il file??si??? bene procediamo con l' analisi: prendiamo confidenza con i tasti della toolbar in IDA , cerchiamo il tasto che ci da le string reference ( referenze di stringa sarebbero le variabili stringa che sono state impostate come variabili inizializzate quando è stato programmato il file, cioè scrivendo un file in asm avremmo scritto:

 

.data

Cicciopancetta db "io sono un pirla!!!"

AndreaGeddon db "è il + grande uomo che esista???"

ecco abbiamo dichiarato delle variabili che sono Cicciopancetta e AndreaGeddon assegnadolgi uno spazio ben definito in memoria attraverso db e dd e poi abbiamo immesso nello spazio allocato i valori che nel nostro caso corrispondono alle stringhe tra le virgolette. spero di essere stato chiaro e spero che la spiegazione sia giusta:))) Ecco cercate il tasto per creare una lista di string reference , cioè cercate un tasto che abbia questo simbolo sopra "-". dopo averlo trovate non esitate a premerlo... lo avete fatto????? nooooooooooooooooooo avete attivato un super virus... mannaggia e ora come famo??? boh a questa domanda non c è soluzione e noi allora ce ne freghiamo e andiamo avanti......Ovviamente spero che prima di dissassemblare il file abbiate provato ad eseguire il file.... non lo avete fatto??? LEIM fatelo e cercate di far comparire la message box con su scritto:"Non registrato!"........ dopo averlo fatto ed esservi resi conto ritornate ad Ida.... ovviamente avrete capito che nella lista di string reference cercheremo la scritta "Non registrato!" e da li procedendo all' indietro reverseremo il codice per capire come funziona!!! mmmm.... mi sa che i soliti imbranati stanno ancora cercando il tasto per aprire la finestra con le string reference:)))).. dai ce la farete prima o poi!!!!dovreste trovare una riga simile: 

 

"-".data:0040502C  00000010  C  Non registrato!

 

cliccateci sopra due volte e chiudete la finestra dovreste trovarvi in Ida a questa riga di codice:

 

 .data:0040502C aNonRegistrato  db 'Non registrato!',0 

 

visto che sto studiacchiando un pò di programmazione assembly vi do qualche informazione in più su questi dati:)) ovviamente  aNonRegistrato è il nome della variabile che stiamo allocando in memoria cioè il nome che attribuiamo allo spazio che vogliamo riservare in memoria , il "db" sta per define byte e  'Non registrato!' è il valore che immettiamo nello spazio precedentemente dichiarato. sappiate che ogni Ansi tsring in windows deve terminare con un NULL che in esadecimale corrisponde a 0, cioè dice alla chiamata che userà tale variabile che la stringa termina con uno zero e deve finire di allocarla quando lo incontrà:))..... spero di avervi fatto capire qualcosa!!! Adesso una volta notati questi particolari andiamo al sodo della questione:

 

.data:0040502C aNonRegistrato  db 'Non registrato!',0  ; DATA XREF: .text:004012E0o

 

Ida è così bello che vi dice che il dato che abbiamo immagazzinato è referenziato , diciamo usato, alla riga della sezione .text indirizzo 004012E0 (Image base + Relative Virtual Address) e ci da la possibilità cliccando due volte su DATA XREF: .text:004012E0o di andare a quell indirizzo!!!!! Potere ad IDAAAAAAAAAAAAAAAAAAA......... Cliccato??? Ok dovremmo trovarci qui:

 

.text:004012D5 loc_0_4012D5:                           ; CODE XREF: .text:004012ADj

.text:004012D5                 mov     ecx, [esp+24h]

.text:004012D9                 push    10h

.text:004012DB                 push    offset aRegistration ; "Registration"

.text:004012E0                 push    offset aNonRegistrato ; "Non registrato!"

.text:004012E5                 push    ecx

.text:004012E6                 call    ds:MessageBoxA

 

 Come vedete ritroviamo la chiamata alla message box che guarda caso usa proprio la variabile che abbiamo sopra analizzato!!!!

Innanzitutto diamo uno sguardo ad un file che a noi deve piacere per forza e che è uno dei punti cardine della programmazione sotto windows l' Api reference. Un Api è una blocco di codice che è contenuto nelle dll e che viene richiamato ogni volta che se ne richiede bisogno per esempio: se vogliamo far apparire auna messagebox possiamo sfruttare un Api che si chiama messagebox e che è contenuta in una dll di windows così nella programmazione sotto windows risparmiamo tempo ad implementarla(= scriverla ed eseguirla). L' Api MessageBoxA è quindi rappresentabile come una funzione a cui noi passiamo dei parametri e che ci ritorna dei valori:

 

int MessageBox(

 

    HWND hWnd,  // handle of owner window//handle della nostra finestra

    LPCTSTR lpText, // address of text in message box//indirizzo in cui allochiamo il testo

    LPCTSTR lpCaption,  // address of title of message box // indirizzo in cui allochiamo il titolo 

    UINT uType             // style of message box//tipo di message box

   );

 

come possiamo vedere è una funzione che ritorna un intero, a seconda del valore che assume tale intero avremo diversi casi: ci ritornerà 0 se non c è abbastanza memoria per  eseguire la messagebox,altrimenti il valore di ritorno sarà un valore che dipenderà dal tipo di messagebox!!! vediamo un piccolo sorgente in asm che vi permetterà di capire come lavora un programma in asm:

 

__________________CUT HERE____________________________

.386

.model flat,stdcall

option casemap:none

 

include \masm32\include\windows.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib            ; calls to functions in user32.lib and kernel32.lib

include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

 

.data

CiccioRiccio db "Win32 is cool!"

CiccioFiccio db "Ecco la vostra prima message box:URRAAAAA"

 

.code

start:

push MB_OKCANCEL

push offset CiccioFiccio

push offset CiccioRiccio

push NULL

call MessageBoxA

cmp eax,IDOK

jnz Ciccio

push MB_OKCANCEL

push offset CiccioRiccio

push offset CiccioFiccio

push NULL

call MessageBoxA

Ciccio:

push 0

call ExitProcess

end start

______________CUT HERE_____________________

 

le linee di codice sono mooooolto semplici e sono state assemblate con il compilatore masm!!! allora scorriamo il codice indietro cercando il controllo che ci faccia saltare alla message box di errore che è quella che abbiamo dettagliatamente analizzato. Poche righe sopra troviamo il controllo e abbiamo le seguenti linee di codice: 

 

.text:004012A5 loc_0_4012A5:                           ; CODE XREF: .text:0040128Cj

.text:004012A5                 cmp     pappagallo, 1Fh ; ecco qui il controllo

.text:004012AD                 jnz     short loc_0_4012D5 ;salta se il controllo fallisce

.text:004012AF                 mov     eax, [esp+24h]

.text:004012B3                 push    40h

.text:004012B5                 push    offset aRegistration ; "Registration"

.text:004012BA                 push    offset aComplimentiCeL ; "Complimenti ce l'hai fatta!"

.text:004012BF                 push    eax

.text:004012C0                 call    ds:MessageBoxA

 

allora la riga di codice:

 

 cmp     pappagallo, 1Fh

 

fa il confronto fra due valori che possono e no essere due registri nel nostro caso controlla che ciò che è contenuto nella variabile pappagallo sia uguale al valore esadecimale 1F che corrisponde al valore decimale 31. esattamente cmp sta per "compare" ed esegue tale confronto! la riga di codice:

 

jnz     short loc_0_4012D5

 

è un salto condizionato cioè salta alla locazione 4012D5 se il valore ritornato dal confronto non è zero.Infatti jnz sta per "junp if not zero". semplicemente pensate che il compare faccia la sottrazione tra i valori e il risultato sia zero se sono uguali e uno se non sono uguali, il jump successivo opera in base a quei valori.... nel nostro caso se i due valori sono uguali il risultato del compare è zero e quindi non esegue il salto!!!!Si nota velocemente che se il salto non viene eseguito si arriva alla call di avvenuta registrazione!!! il passo successivo sarà dare un nome alla variabile che viene confrontata che io ho già rinominato in pappagallo!!! Come si fa??? semplicemente andando sulla variabile selezionandola e cliccando sul tasto destro del mouse si apre una tendina in cui c è la riga rename.... cliccateci sopra e date alla avriabile il nome che volete!!!! ecco fatto ora avate rinominato la variabile e vi sarà più facile ricondurvi ad essa scorrendo il codice, come vi sarà più facile ricercarla!!! Allora vediamo come agire.Andiamo su search si aprirà il menu a tendina e cerchiamo la voce text... fatto? cliccateci sopra e cercate la parola pappagallo e cercate il nome con cui avete rinominato la variabile che vi ho detto di rinominare! fatto?? bene la prima volta che incontriamo tale variabile è un questa parte di codice:

  

.text:0040104A                 push    0               ; hTemplateFile

.text:0040104C                 push    4000000h        ; dwFlagsAndAttributes

.text:00401051                 push    0               ; dwCreationDisposition

.text:00401053                 push    0               ; lpSecurityAttributes

.text:00401055                 push    0               ; dwShareMode

.text:00401057                 push    0               ; dwDesiredAccess

.text:00401059                 push    offset a_Siwvid ; lpFileName

.text:0040105E                 call    ds:CreateFileA

.text:00401064                 cmp     eax, 0FFFFFFFFh

.text:00401067                 jnz     short loc_0_401070

.text:00401069                 or      byte ptr pappagallo, 10h

 

come notate troviamo un altro compare che esegue un confronto fra il valore 0FFFFFFFFh e il registro eax che contiene il valroe tornato dalla chiamata precedente cioè call ds:CreateFileA.... come si può facilemente notare il valore di ritorno di una funzione è sempre restituito in eax!!!!! o quanto meno nella maggior parte dei casi:-)).... Allora notiamo che viene eseguita un Api che andiamo a studiare:

 

HANDLE CreateFile(

 

    LPCTSTR lpFileName,            // pointer to name of the file

    DWORD dwDesiredAccess,      // access (read-write) mode

    DWORD dwShareMode,            // share mode

    LPSECURITY_ATTRIBUTES lpSecurityAttributes,     // pointer to security attributes

    DWORD dwCreationDistribution,            // how to create

    DWORD dwFlagsAndAttributes, // file attributes

    HANDLE hTemplateFile             // handle to file with attributes to copy 

   );

 

questa Api crea o apre un dei seguenti oggetti:

 

·                    files

·                    pipes

·                    mailslots

·                    communication resources

·                    consoles

·                    directory (only open)

 

come valore di ritorno si ha un handle che può essere usato per accedere all' oggetto cioè un handle di apertura al file specificato:-)...... Ricordatevi di dare uno sguardo all' ApiReference.

Guardando bene come è costruita questa funzione notiamo subito che il file che va a creare o aprire è il file siwvid.* che è un file del nostro debugger preferito softice!!! se la ricerca succede abbiamo un valore di ritorno che è confrontato con -1 e si nota che il salto avviene se il confronto fallisce!! Se non viene eseguito il jnz abbiamo che viene fatta un operazione di or tra la variabile pappagallo e il numero 10h ( in decimale 16 :-)) Chiarooooooooooooooooooo!!!!!!

Alcune cose che non vi spiego le lascio capire a voi perchè se no non sprecate le vostre menti bacate come faccio io ogni giorno con i miei bei tensori  di tensione e tensori di deformazione o il mio bel plane stress e plane strainnnnnnnn!!!!! passiamo avanti e con lo stesso metodo cerchiamo un altra volta la parola pappagallo scoprendo questa parte di codice:

 

 push    ecx

.text:004010ED                 push    0F003Fh

.text:004010F2                 push    0

.text:004010F4                 push    offset aUic     ; "UIC"

.text:004010F9                 push    80000001h

.text:004010FE                 call    ds:RegOpenKeyExA

.text:00401104                 test    eax, eax

.text:00401106                 jnz     short loc_0_40110F

.text:00401108                 or      byte ptr pappagallo, 2

 

et voila.... siamo punto e accapo.... il discorso è sempre quello cambia solo l' Api!!! vediamola inzieme inzieme:

 

LONG RegOpenKeyEx(

 

    HKEY hKey,   // handle of open key

    LPCTSTR lpSubKey,            // address of name of subkey to open

    DWORD ulOptions,            // reserved

    REGSAM samDesired,            // security access mask

    PHKEY phkResult             // address of handle of open key

   );      

 

è una funzione che restituisce cosa????vediamo subito: se la funzione viene eseguita correttamente si ha come valore di ritorno ERROR_SUCCESS altrimenti si ha un valore diverso definito nella libreria WINERROR.H!!! cerchiamo, cerchiamo e troviamo questo confronto:

 

cmp     farina, 7CDh

.text:00401124                 jnz     short loc_0_40112D

.text:00401126                 or      byte ptr pappagallo, 1

 

dobbiamo fare un compare tra la variabile che io ho rinominato "farina" e quel numerello esadecimale... se cerchiamo la variabile farina notiamo che è referenziata in questa pare di codice :

 

.text:00401003                 push    ebx

.text:00401004                 push    esi

.text:00401005                 push    edi

.text:00401006                 push    offset farina   ; lpSystemTime

.text:0040100B                 call    ds:GetSystemTime

 

provate voi adesso ad usare l' APi reference e capire che cosa è quella variabile:-))))!!!!!

cercando e trovando ed analizzando e reversando.... ando ando ando si giunge qui:

 

.text:00401216                 push    esi

.text:00401217                 call    ds:IsZoomed

.text:0040121D                 test    eax, eax

.text:0040121F                 jz      loc_0_40110F

.text:00401225                 or      byte ptr pappagallo, 4

 

anche qui lascio il tutto a voi!!! Ormai è chiaro come funziona!!! e se cercate l' ultima volta pappagallo trovate il compare finale :

 

cmp     pappagallo, 1Fh

.text:004012AD                 jnz     short loc_0_4012D5

.text:004012AF                 mov     eax, [esp+24h]

.text:004012B3                 push    40h

.text:004012B5                 push    offset aRegistration ; "Registration"

.text:004012BA                 push    offset aComplimentiCeL ; "Complimenti ce l'hai fatta!"

.text:004012BF                 push    eax

.text:004012C0                 call    ds:MessageBoxA

 

Quindi il tutto si riduce ad capire come funzionano quelle benedette Api e cosa ci danno come valore di ritorno per poter far avvenire i salti:-)))!!! Io avrei finito e vorrei salutare alcuni miei grandi amiconi: AndreaGeddonz..Yado..!!!!!raggazi perdono se sono li pronto a rompervi ogni santa volta ma siete i miei guru:)))!!.ahhahahha un saluto particolarissimo ad un mio amico gay :"ciao Giovanni!" ed in fine un saluto a tutto il chan di crack-it!!!!

il mio tut è semplice semplice perchè non sono un reverser ma un appassionato che a tempo perso si diverte con queste cose!!!!grazie  e arrivederci!!!

 

Note finali

allora se penso a queste note la-la-si-do-do..... mi sa che non vanno bene!!! io reverso perchè ...... non ho un cazzo da fare!!!! :PPP Rotfl questa si che si chiama passione ;p NdQue

Disclaimer

Noi reversiamo solo a scopo didattico!

Capitoooooooo????? Bhè credo di si ;))))