|
|
|
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
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?