Linux cracking
Come crackare sotto linux senza un disassembler
(Tradotto e riadattato da Quequero)

 
Not Assigned

26th October 1998

by adq

 

Courtesy of Fravia's page of reverse engineering

 
fra_00xx
98xxxx
handle
1100
NA
PC

Well, well: adq is back with a Linux reversing essay that will surely be welcome among the rapidly growing community of Linux users among my readers (I wonder how comes that noone that made the 'great sprung' and went from windoze to Linux, happened to go back to Windoze :-) As a matter of fact many good reversers are (almost) not publishing essays any more because they have lost any interest whatsoever in windozed targets... in fact -as you should know- if you'r seriously working (and not just playing with a mouse) you can work in Linux QUICKER, BETTER, and with a greater efficacity... I guess that the last one of my readers remaining in windoze will have soon to turn the lights off in an empty room... you don't believe me? Look better around you: see Micro$oft's building over there? Getting dark isn't it? That's because there are less and less people behind its windows... :-)

 
 

There is a crack, a crack in everything That's how the light gets in

 

Rating

( )Beginner (x)Intermediate ( )Advanced ( )Expert

 


Questo tutorial � per tutti coloro che usano linux con il gcc e conoscono qualcosa di C


Linux cracking
Come crackare sotto linux senza un disassembler

Written by adq

Introduzione

Il seguente tutorial mostra come modificare il comportamento di un programma per linux rimpiazzando tutte le funzioni che usa da librerie esterne

Tools necessari

Linux, gcc, emacs

Essay

Ho letto svariati tutorial su linux, ma in nessuno sembra esser stata menzionata questa semplice via per modificare il comportamento di un programma compilato..........Seza guardare al disassemblato.

Prima di tutto scriviamo un programma demo chiamato timetest:

                   #include <stdio.h>
                   #include <time.h>

                   int main(int argc, char* argv[])
                   {
                     time_t curTime;
                     struct tm *curTimeDecoded;

                     time(&curTime);
                     curTimeDecoded = localtime(&curTime);
                  
                     if (curTimeDecoded->tm_year > 95)
                       printf("Too late\n");
                     else
                       printf("In time\n");
                   }
                 

mettiamo questo codice nel file "timetest.c" e compiliamolo come segue:

                         gcc -o timetest timetest.c
                 

verr� fuori un programma che testa l'anno corrente. Se l'anno � maggiore del 1995 allora scriver� a schermo "Too late". Se minore o uguale al 1995 allora scriver� "In time". Per patchare questa finestra affinch� stampi sempre "In time" si potrebbe caricare il tutto in un debugger, tracciare fino alla chiamata e quindi patcharla. O forse preferisci usare una dead-listing e IDA.

In linux esiste una via molto pi� facile. Creare un nuovo file chiamato questa volta "time.c", mettendo in esso questo codice:

                   #include <time.h>
                   #include <stdio.h>

                   time_t time(time_t* tp)
                   {
                     printf("haha\n");
                   
                     return(2000);
                   }
                 

Come potete vedere, questo � un rimpiazzamento della funzione time(), che stampa a schermo la stringa "haha" e ritorna come anno corrente il 2000.

Questa volta compiliamolo come segue:

                         gcc -c time.c -o time.o
                         ld -shared -o time.so time.o
                 

La seconda linea trasforma il normale file oggetto prodotto dalla prima linea in uno shared object library (ho preferito mantenere la nomenclatura originale NdQuequero). Questo passo � essenziale altrimenti ci ritroveremo con strani errori come: "ELF file's phentsize not the expected size".

Adesso, per correggere il programma scriviamo: "export LD_PRELOAD=./time.so". Questa riga dice al linker a runtime di linux (ld.so* o ld-linux.so*) di cercare in questa libreria per le funzioni necessarie prima di consultare le librerie standard.

Avviamo il programma....E lui scriver� a schermo "haha", seguito dalla stringa "In time", non importante quale sia l'hanno corrente sul sistema. Ma state attenti.....Dal momento che abbiamo esportato LD_PRELOAD, questo influir� ogni programma nella shell corrente finch� tu non rimetterai a posto LD_PRELOAD e uscirai dalla shell.

Comunque c'� un piccolo problema. Se vuoi manomettere il tempo in certe occasioni, ma usare la funzione time() in altre....Allora non puoi chiamare semplicemente time() - finirai in un noioso loop ricorsivo. Il modo in cui ho raggirato � stato trovando l'import table nel binario dell'ELF, e cambiando il nome della funzione che importa da "time" a qualcosa come "Xime". Poi ho scritto la mia versione di Xime e quindi siete liberi di chiamare la funzione Xime. Tutto questo pu� esser fatto dall'interno di emacs usando un normale search & replace. Ma c'� probabilmente una via migliore per farlo.

Final Notes

Vorrei che windows poter far tutto questo :)

Ob Duh

Non necessari


__--== Questi link non funzionano dal momento che fravia+ ha chiuso ==--__

You are deep inside fravia's page of reverse engineering, choose your way out:
homepage links search_forms +ORC students' essays academy database
reality cracking how to search javascript wars
tools anonymity academy cocktails antismut CGI-scripts mail_fravia+
Is reverse engineering legal?


UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    ContactMe  CrackMe   Forum       
Links   NewBies   News   Iscrizione   Lezioni       
Tools   Tutorial   Search   UIC Faq

UIC