Protected Mode security mechanisms support in DosBox
Click here to load reader
-
Upload
georgios-marios-papadopoulos -
Category
Technology
-
view
221 -
download
2
description
Transcript of Protected Mode security mechanisms support in DosBox
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
1
“Μειέηε ππνζηήξημεο κεραληζκώλ
αζθάιεηαο Protected Mode ζην DosBox”
ζην κάζεκα
“Πποηγμένοι Μικποεπεξεπγαζηέρ”
Σςμμεηέσονηερ:
Σθξεπεηόο Δεκήηξηνο, 7380
Παπαδόπνπινο Γεώξγηνο Μάξηνο, 7356
Εξάμηνο: 9o
Ακαδημαικό Έηορ: 2013-2014
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
2
Σκοπόρ
Η δνθηκή ηωλ παξαθάηω εξωηεκάηωλ ζην DOSBOX:
1. Μεηάβαζη από Code Segment ζε άλλο με ηο ίδιο privilege level (ζηο παπάδειγμα
και ηα δύο μηδέν).
2. Μεηάβαζη από Code Segment ζε άλλο με ςτηλόηεπο privilege level (ζηο
παπάδειγμα από μηδέν ζε ηπία).
3. Μεηάβαζη από Code Segment ζε άλλο με σαμηλόηεπο privilege level (ζηο
παπάδειγμα από ηπία ζε μηδέν).
4. Μεηαθοπά Data Segment ζε Code Segment.
5. Μεηαθοπά Code Segment ζε Data Segment.
6. Μεηαθοπά ζε ζημείο πος ςπεπβαίνει ηο limit ενόρ Code Segment.
7. Μεηαθοπά ζε ζημείο πος ςπεπβαίνει ηο limit ενόρ Data Segment.
8. Μεηάβαζη μέζυ Call Gate ζε σαμηλόηεπο privilege level.
9. Έλεγσορ δςναηόηηηαρ εκηέλεζηρ πποζηαηεςμένυν ενηολών από privilege level 3.
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
3
Χπηζιμοποιούμενα Επγαλεία
DOSBOX
Notepad ++
Intel Manual 386
1. Μεηάβαζη από Code Segment ζε άλλο με ηο ίδιο privilege level (ζηο
παπάδειγμα και ηα δύο μηδέν).
Δεκηνπξγήζακε έλα Code Selector Test (CODE_SEL_TEST) θαη ηνλ αληίζηνηρν
Descriptor νη νπνίνη είλαη θιώλνη ηνπ CODE_SEL θαη ηνπ code_sel_descr έηζη ώζηε λα
κεηαβνύκε από privilege level 0 ηνπ CODE_SEL ζην νπνίν είκαζηε ζην privilege level 0
ηνπ CODE_SEL_TEST. Γηα λα εθηειέζνπκε απηό ην εξώηεκα βάιακε ηελ εληνιή:
call CODE_SEL_TEST:task2
Σύκθωλα κε ην 6.3.3 ηνπ manual ε κεηαθνξά ειέγρνπ κεηαμύ 2 code segment κε ίδην
privilege level είλαη επηηξεπηή θαη ην πξόγξακκα έηξεμε θαλνληθά όπωο αλακελόηαλ.
Τα CODE_SEL_TEST θαη code_descr_test νξίδνληαη ζην αξρείν gdt.asm ωο
εμήο:
CODE_SEL_TEST equ $-gdt_start
code_descr_test: istruc seg_descriptor
at limit0_15, dw 0xFFFF ; limit 0:15
at base0_15, dw 0 ; base 0:15
at base16_23, db 0 ; base 16:23
at type_dpl, db 0x9B ; 1 00 1 001 1 = present + DPL=0 +
code_segment_descr + C=0 + Read + not_active
at limit16_19,db 0xCF ; 1 1 00 1111 = Granularity + 32bit code + limit
16:19
at base24_31, db 0 ; base 24:31
; base = 0x0, limit = 0xFFFFFFFF
iend
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
4
Φηηάρλνπκε ην base address ζην αξρείν stdlib.asm ωο εμήο:
; Update Code Descriptor base address field
push eax
push word code_descr_test
call initialize_descriptor_base
add sp, 6
2. Μεηάβαζη από Code Segment ζε άλλο με ςτηλόηεπο privilege level (ζηο
παπάδειγμα από μηδέν ζε ηπία).
Δεκηνπξγήζακε έλα CODE_SEL_TS1 θαη ηνλ αληίζηνηρν Descriptor νη νπνίνη
είλαη θιώλνη ηνπ CODE_SEL θαη ηνπ code_sel_descr κε privilege level 3 έηζη ώζηε λα
κεηαβνύκε από privilege level 0 ηνπ CODE_SEL ζην νπνίν είκαζηε ζην privilege level 3
ηνπ CODE_SEL_TS1. Γηα λα εθηειέζνπκε απηό ην εξώηεκα βάιακε ηελ εληνιή:
call CODE_SEL_TS1:task2
Σύκθωλα κε ην θεθάιαην 6.3.3 γηα Conforming Bit 0, επεηδή ην DPL (3) δελ είλαη
ίζν κε ην CPL (0), θαλνληθά έπξεπε ην πξόγξακκα λα κελ ηξέμεη. Ωζηόζν ην DOSBOX
πξνθαλώο δελ θάλεη Privilege Level Checking νπόηε ην πξόγξακκα έηξεμε.
Σύκθωλα κε ην θεθάιαην 6.3.3 γηα Conforming Bit 1, επεηδή ην DPL (3) δελ είλαη
κηθξόηεξν ή ίζν ηνπ CPL (0), θαλνληθά έπξεπε ην πξόγξακκα λα κελ ηξέμεη. Ωζηόζν ην
DOSBOX πξνθαλώο δελ θάλεη Privilege Level Checking νπόηε ην πξόγξακκα έηξεμε.
Τα CODE_SEL_T1 θαη code_descr_TS1 νξίδνληαη ζην αξρείν gdt.asm ωο εμήο:
; The code selector and code descriptor of the task1 with privilege level 3
CODE_SEL_TS1 equ $-gdt_start
code_descr_TS1: istruc seg_descriptor
at limit0_15, dw 0xFFFF ; limit 0:15
at base0_15, dw 0 ; base 0:15
at base16_23, db 0 ; base 16:23
at type_dpl, db 0xFB ; 1 11 1 101 1 = present + DPL=3 +
code_segment_descr + C=0 + Read + not_active
at limit16_19,db 0xCF ; 1 1 00 1111 = Granularity + 32bit code + limit
16:19
at base24_31, db 0 ; base 24:31
; base = 0x0, limit = 0xFFFFFFFF
iend
; Update Code Descriptor base address field
; Update Code Descriptor TS1 base address field
push eax
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
5
push word code_descr_TS1
call initialize_descriptor_base
add sp, 6
3. Μεηάβαζη από Code Segment ζε άλλο με σαμηλόηεπο privilege level (ζηο
παπάδειγμα από ηπία ζε μηδέν).
Αξρηθά, πεγαίλνπκε κέζω iret ζην task1, ην νπνίν εθηειεί ην CODE_SEL_TS1 ην
νπνίν έρεη Privilege Level 3. Από εθεί ζέινπκε λα πάκε ζην CODE_SEL κε Privilege
Level 0 κέζω ηεο εληνιήο:
call CODE_SEL:task2
Σύκθωλα κε ην θεθάιαην 6.3.3 ηνπ manual γηα Conforming Bit 0, επεηδή ην DPL
(0) δελ είλαη ίζν κε ην CPL (3), θαλνληθά έπξεπε ην πξόγξακκα λα κελ ηξέμεη. Ωζηόζν
ην DOSBOX πξνθαλώο δελ θάλεη Privilege Level Checking νπόηε ην πξόγξακκα
έηξεμε.
Σύκθωλα κε ην θεθάιαην 6.3.3 ηνπ manual γηα Conforming Bit 1, επεηδή ην DPL
(0) είλαη κηθξόηεξν ή ίζν ηνπ CPL (3), θαλνληθά έπξεπε ην πξόγξακκα λα ηξέμεη, όπωο
θαη έγηλε.
4. Μεηαθοπά Data Segment ζε Code Segment.
Πξνζπαζνύκε λα κεηαθηλήζνπκε ην DATA_SEL ζηνλ CS ηνπ πξνγξάκκαηνο
κέζω ηωλ εληνιώλ:
call DATA_SEL:0
Σύκθωλα κε ην θεθάιαην 6.3.1.1 ηνπ manual ε κεηαθίλεζε απηή είλαη κε
επηηξεπηή δηόηη δελ κπνξνύκε λα βάινπκε Data Selector ζην CS. Τν DOSBOX βγάδεη
κήλπκα: CALL:Descriptor type b unsupported.
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
6
5. Μεηαθοπά Code Segment ζε Data Segment.
Πξνζπαζνύκε λα κεηαθηλήζνπκε ην CODE_SEL ζηνλ DS ηνπ πξνγξάκκαηνο
κέζω ηωλ εληνιώλ:
mov ax, CODE_SEL
mov ds, ax
Σύκθωλα κε ην θεθάιαην 6.3.1.1 ηνπ manual κηα ηέηνηα κεηαθίλεζε δελ
απαγνξεύεηαη γη’ απηό θαη ην DOSBOX δελ καο έβγαιε ηέηνην πξόβιεκα.
6. Μεηαθοπά ζε ζημείο πος ςπεπβαίνει ηο limit ενόρ Code Segment.
Φηηάμακε ην CODE_SEL_LIMIT ωο θιόλν ηνπ CODE_SEL θαη ην call_descr_limit
ωο θιόλν ηνπ call_descr κε κόλε δηαθνξά όηη ην call_descr_limit έρεη limit 0 γηα λα
δνθηκάζνπκε ην Limit Checking κέζω ηωλ εληνιώλ:
call CODE_SEL_LIMIT:0xffff
Σύκθωλα κε ην θεθάιαην 6.3.1.2 ηνπ manual κηα ηέηνηα κεηαθνξά ειέγρνπ δελ
είλαη επηηξεπηή δηόηη ην limit καο είλαη κεδέλ θαη ην offset δηάθνξν ηνπ κεδελόο. Ωζηόζν
ην DOSBOX δε δέρζεθε θαλ ηε κεηαθίλεζε βγάδνληαο ην κήλπκα: CALL:Descriptor type
b unsupported.
Τα CODE_SEL_LIMIT θαη code_descr_limit νξίδνληαη ζην αξρείν gdt.asm ωο
εμήο:
CODE_SEL_LIMIT equ $-gdt_start
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
7
code_descr_limit: istruc seg_descriptor
at limit0_15, dw 0x0 ; limit 0:15
at base0_15, dw 0 ; base 0:15
at base16_23, db 0 ; base 16:23
at type_dpl, db 0x9B ; 1 00 1 001 1 = present + DPL=0 +
code_segment_descr + C=0 + Read + not_active
at limit16_19,db 0x0 ; 1 1 00 1111 = Granularity + 32bit code + limit
16:19
at base24_31, db 0 ; base 24:31
; base = 0x0, limit = 0x0
iend
7. Μεηαθοπά ζε ζημείο πος ςπεπβαίνει ηο limit ενόρ Data Segment.
Φηηάμακε ην DATA_SEL_LIMIT ωο θιόλν ηνπ DATA_SEL θαη ην data_descr_limit
ωο θιόλν ηνπ data_descr κε κόλε δηαθνξά όηη ην data_descr_limit έρεη limit 0, έηζη ώζηε
λα δνθηκάζνπκε ην Limit Checking κέζω ηωλ εληνιώλ:
mov word ax, DATA_SEL_LIMIT
mov ds, ax
mov ax, vidmem_start
Σύκθωλα κε ην θεθάιαην 6.3.1.2 ηνπ manual κηα ηέηνηα κεηαθνξά ειέγρνπ δελ
είλαη επηηξεπηή δηόηη ην limit καο είλαη κεδέλ θαη ην offset δηάθνξν ηνπ κεδελόο. Ωζηόζν
ην πξόγξακκα έηξεμε θαλνληθά άξα πξνθαλώο ην DOSBOX δελ θάλεη Limit Checking.
Τα CODE_SEL_LIMIT θαη code_descr_limit νξίδνληαη ζην αξρείν gdt.asm ωο
εμήο:
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
8
DATA_SEL_LIMIT equ $-gdt_start
data_descr_limit: istruc seg_descriptor
at limit0_15, dw 0x0 ; limit 0:15
at base0_15, dw 0 ; base 0:15
at base16_23, db 0 ; base 16:23
at type_dpl, db 0x92 ; 1 00 1 101 0 = present + DPL=0 +
data_segment_descr + E=0 + RW + not_active
at limit16_19,db 0x0 ; 1 1 00 1111 = Granularity + Big + limit 16:19
at base24_31, db 0 ; base 24:31
; base = 0x0, limit = 0xFFFFFFFF
iend
8. Μεηάβαζη μέζυ Call Gate ζε σαμηλόηεπο privilege level.
Φηηάμακε έλα Call gate κε DPL 3 ώζηε λα κεηαβνύκε από Privilege Level 3 ζε
Privilege Level 0. Μεηαβήθακε ζην task1 κέζω iret θαη κεηά ζέιακε λα θάλνπκε ηε
κεηαθνξά κέζω ηεο εληνιήο:
call CALL_GATE_SEL:0
Σύκθωλα κε ην 6.3.4 ηθαλνπνηνύληαη νη πξνϋπνζέζεηο, ωζηόζν ην πξόγξακκα δελ έηξεμε ζην DOSBOX θαη έβγαιε κήλπκα: CALL:GATE:SS: no writable data segment. To Call Gate ην νξίδνπκε ζην αξρείν gdt.asm ωο εμήο:
; The call gate selector and descriptor
CALL_GATE_SEL equ $-gdt_start
call_gate_descr: istruc call_gate_descriptor
at offset0_15, dw 0
at selector, dw 0
at dword_count, db 0
at p_type_dpl, db 0xEC ; Εδώ νξίζακε DPL=3
at offset16_31, dw 0
iend
Τν selector θαη ην offset ηνπ call gate descriptor ηα θηηάρλνπκε ζην αξρείν
stdlib.asm ωο εμήο:
; Update the selector of the call gate with the CODE_SEL
mov word [call_gate_descr+2], CODE_SEL;
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
9
; Update the offsets of the call gate with the address of task2
push eax
mov eax, task1
mov word [call_gate_descr], ax;
shr eax, 16
mov word [call_gate_descr+6], ax;
9. Έλεγσορ δςναηόηηηαρ εκηέλεζηρ πποζηαηεςμένυν ενηολών από privilege
level 3.
Μεηαβαίλνπκε κε iret ζην task1 θαη από εθεί (ελώ είκαζηε ζε CPL 3)
πξνζπαζνύκε λα εθηειέζνπκε ηελ πξνζηαηεπκέλε εληνιή:
hlt
Σύκθωλα κε ην θεθάιαην 6.3.5.1 ε εληνιή απηή δελ κπνξεί λα εθηειεζηεί δηόηη
απαηηεί ην CPL λα είλαη κεδέλ. Τν DOSBOX θξαζάξεη αθνύ βγάιεη ην κήλπκα Exit to
error: INT: Inner level: Stack segment not writable.
Πανεπιςτήμιο Πατρών Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίασ Υπολογιςτών
Τομέασ Ηλεκτρονικήσ και Υπολογιςτών Προηγμένοι Μικροεπεξεργαςτέσ
10