|
|
Che significa 'Condizioni Estreme'? Quando sei seduto davanti a un computer
su cui è installato solo MS-DOS, senza alcun compilatore, editor esadecimale, shells,
debuggers e hai bisogno di recuperare dati perduti, rimuovere virus, o scriverne di nuovi.
In una situazione del genere la maggioranza dei programmatori non sarà capace di fare niente, e
un amministratore di sistema potrà illudersi che il suo sistema sia sicuro.
Ho scelto MS-DOS come sistema operativo da programmare perché
in alcune versioni di Windows ci sono molte cose che faciliteranno questo lavoro (ad
esempio in Windows 98 c'è un browser incluso che interpreta VBScript e JavaScript
così che si può scrivere facilmente un editor esadecimale e altro).
Questo articolo si dimostrerà interessante sia per i principianti che per gli Hackers esperti
Raccomando la lettura ai programmatori, amministratori, e chiunque vuole sentire lo spirito Hacker,
che ora sta scomparendo con le vecchie generazioni.
INIZIAMO
Per leggere e capire questo articolo hai bisogno dei seguenti requisiti:
conoscenza dell'Assembler, esperienza di lavoro sotto MS-DOS.
Avrai anche bisogno di una lista degli opcodes (codici operativi) x86,
(puoi trovarli qui su Elf Qrin Hacking Labs), la tavola dei codici ASCII, e un sacco di tempo libero.
Prima di tutto abbiamo bisogno di qualche tipo di editor di testi.
Ma l'amministratore ha rimosso tutto quello che potrebbe aiutarci.
C'è solo una cosa che fa la differenza tra un buon Hacker da qualsiasi altro Hacker:
La sua profonda conoscenza di tutto quello con cui lavora.
Se lavora sotto DOS saprà tutto al riguardo.
C:\copy con test.com
Eseguirai l'editor di testi. Questo è il nostro strumento. Ma non sappiamo ancora come
scrivere il file binario.
Se dai un'occhiata al manuale DOS ufficiale, troverai la risposta.
Usando il tasto ALT e la tastiera numerica puoi crearlo.
Prima di tutto controlla che il NUMlock sia acceso. Ora premi ALT, scrivi 195, e rilascia
il tasto ALT. Per salvare il file e uscire premi CTRL-Z e Invio. Eseguilo.
Questo non fa niente, ma pone in HALT il sistema.
Se lo disassembli scoprirai che il file test.com consiste solo nel comando RETN.
Come avrai già indovinato l'opcode di RETN è 195 (equivalente a 0xC3 in Hex e 195 in decimale).
FUNZIONI AVANZATE
Prova a inserire questo:
ALT-180 ALT-09 ALT-186 ALT-09 ALT-01
ALT-205 ! ALT-195 ALT 32 Salve Elf Qrin!$
Poi premi CTRL-Z e premi Invio/enter. E' chiaro che questo programma
stampa sul video "Salve Elf Qrin!". Disassembliamolo:
Spero tu conosca l'ordine inverso della macchina (Little/Big Endian)
(ALT-09 ALT-01 =
109). Dunque, per farti vedere la bellezza di questo metodo ho usato il simbolo '!' ==
0x21 per richiamare l'interrutpt 0x21. Conoscendo i codici ASCII puoi facilitarti la vita.
Ma perché abbiamo bisogno di questo simbolo (20h == ALT-32 == " ") a 49E0:0108 ?
Questo è il problema principale di questo metodo. Usando il tasto ALT e il numero corrispondente che
ci interessa, non possiamo inserire alcuni simboli. Ecco una lista di questi:
Dovrai evitare questi simboli. Se guardi il codice, vedrai che il vero offset è
0x108. Dopo aver aggiunto un simbolo l'offset diventa 0x109.
C'è un modo più elegante per farlo:
Uno dei problemi principali è quello di trovare l'offset delle variabili e delle etichette (label).
Puoi scrivere il programma su un foglio, dare alle variabili dei nomi simbolici e poi
il programma sarà pronto. Sarà facile trovare i necessari offset e indirizzi.
Un'altra possibilità è di dichiarare le variabili prima del loro uso:
jmp short $+20 - riserva 20 byte per la stringa. Questo metodo può anche essere
usato per le label.
L'ESEMPIO
Immagino tu sia stanco di questi programmi teorici e ti senta pronto
per lavorare con questo metodo.
Come esempio proveremo a fare un programma che cancella il Boot Sector.
Attenzione! L'uso di questo programma per distruggere informazioni è un crimine.
Usalo solo per scopi sperimentali.
Prima di tutto scriviamolo in Assembler.
(Come vedi abbiamo uno #0, un #3 e un #19. Modifichiamo il programma per evitarli):
E' un esempio abbastanza difficile. La programmazione Assembler e gli Interrupt non sono
il soggetto di questo articolo. Posso solo indirizzarti verso altri riferimenti che puoi
facilmente trovare su Internet.
E' tutto: metti questo programma nella macchina vittima a avrai un'arma potente.
Ti raccomando di usarlo con molta attenzione.
Fortunatamente (o sfortunatamente, depende dall'orientamento del lettore), nel
BIOS c'è una protezione da scrittura del boot (boot write protection, qualche volta chiamata
"Virus Warning") che bloccherà qualsiasi tentativo di modificare il boot sector.
C'è dell'altro, può esserci installato del software speciale.
Ad esempio, eseguire questo programma sotto Windows98 non sortirà alcun effetto.
Ma possiamo ancora lavorare con le porte I/O dell'Hard Disk a basso livello.
Ecco un esempio di programma che cancellerà il boot sector attraverso le porte
I/O dell'Hard Disk:
Non conosco nessuna protezione famosa che possa 'tracciare' e bloccare quel programma.
Comunque, il programma non fa riferimento a Windows NT, questo OS non permette a
nessun programma senza i necessari privilegi di lavorare con le porte.
Preparare questo programma per l'inserimento usando i vari ALT e ottimizzando la
sua dimensione è un esercizio che lascio ai lettori.
CONCLUSIONE
Non è facile. Tutto questo richiede un sacco di esperienza e talento ma
ti dà un incredibile potenza sulla macchina.
E spero che non userai questa potenza per distruggere come spero anche che questo articolo
possa essere un passo "per tornare al vero Spirito dell'Hacking".
Programmare in Condizioni Estreme
by Alexey Kalmykov (aka B52) Tradotto da Lonely Wolf
INTRODUZIONE
Ma questo non fermerà il vero Hacker...
C'è una funzione non documentata che apre un piccolo editor di testi, ma è sufficiente.
Questo comando DOS:
(con significa "console")
49E0:0100 start:
49E0:0100 B4 09 mov ah,9
49E0:0102 BA 0109 mov dx,offset data_1;
(49E0:0109='Hi !!!!')
49E0:0105 CD 21 int 21h; Servizio DOS ah=funzione 09h
; visualizza la stringa puntata ds:dx
49E0:0107 C3 retn
49E0:0108 20 db 20h
49E0:0109 48 69 20 21 21 21 data_1 db 'Salve Elf Qrin!!$; xref 49E0:0102
0,3,6,8,16(0x10),19(0x13),27(0x1b),255(0xFF)
mov dx,109
dec sx
Queste due varianti sono uguali (dec dx == 1 byte), scegli quella che si addice di più.
mov ah,9
jmp sort $+20
db 'Hi,world!'$
mov dx,0x100+2+2; 0x100 - the base address,2 - length of
; mov ah,9, 2 - length of jmp
B80103 mov ax,00301
B90100 mov cx,00001
BA8000 mov dx,00080
CD13 int 013
C3 retn
xor ax,ax
mov ds,ax
mov ax,00299
inc ax
inc ax
xor cx,cx
inc cx
mov dl,80
mov bx,13h*4
pushf
cli
push cs
call dword ptr [bx]
retn
mov dx, 1F2h
mov al,1
out dx,al
inc dx
out dx,al
inc dx
xor ax,ax
out dx,al
inc dx
out dx,al
mov al, 10100000b
inc dx
out dx,al
inc dx
mov al,30h
out dx,al
lea si, Buffer
mov dx, 1F0h
mov cx, 513
rep outsw