Немогу перейти в кодовый сегмент в большим DPL.

Тема в разделе "WASM.OS.DEVEL", создана пользователем zloi7777, 1 июл 2010.

  1. zloi7777

    zloi7777 New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2010
    Сообщения:
    5
    Пишу простую прогу длЯ защищенного режима. Пока нахожусь в нуливом кольце - все работает отлично, как только менЯю DPL у целивого сегмента с 0 на 3, выскакивает общее нарушение зашиты :dntknw:

    Вот так все работает:


    тут таблица дискрипторов:
    Код (Text):
    1. STRUC   desc_struc      ; структура дескриптора
    2.     limit   dw  0   ; предел
    3.     base_l  dw  0   ; мл. слово физического адреса
    4.     base_h  db  0   ; ст. байт физического адреса
    5.     access  db  0   ; байт доступа
    6.     acces32 db  0
    7.     base_b  db  0
    8. ENDS    desc_struc
    9. ACC_PRESENT     EQU 10000000b ; сегмент есть в памџти
    10. [hr]ACC_CSEG        EQU 00011000b ; сегмент кода
    11. ACC_DSEG        EQU 00010000b ; сегмент данных
    12. ACC_TSSSEG      EQU 00001001b ; TSS
    13. ACC_EXPDOWN     EQU 00000100b ; сегмент расширџетсџ вниз
    14. ACC_CONFORM     EQU 00000100b ; согласованный сегмент
    15. ACC_DATAWR      EQU 00000010b ; разрешена запись
    16.  
    17. ACC_INTR_GATE   EQU 00001110b ; вентиль прерываниџ
    18. ACC_TRAP_GATE   EQU 00001111b ; вентиль исключениџ
    19. ACC_CALL_GATE   EQU 00001100b
    20. ACC_TASK_GATE   EQU 00000101b
    21.  
    22. ACC_RING0       EQU 00000000b
    23. ACC_RING3       EQU 01100000b
    24.  
    25. ; ------------------------------------------------------------
    26. ; ’ипы сегментов
    27. DATA_ACC  = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR                   ; сегмент даннх
    28. CODE_ACC  = ACC_PRESENT OR ACC_CSEG             ; сегмент кода
    29. STACK_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR OR ACC_EXPDOWN    ; сегмент стека
    30. TSS_ACC   = ACC_PRESENT OR ACC_TSSSEG                               ; TSS
    31.  
    32. IDT_ACC   = DATA_ACC                                                ; байт доступа сегмента таблицы IDT
    33. INTR_ACC  = ACC_PRESENT OR ACC_INTR_GATE                            ; байт доступа вентилџ прерываниџ
    34. TRAP_ACC  = ACC_PRESENT OR ACC_TRAP_GATE                            ; байт доступа вентилџ исключениџ
    35. CALL_ACC  = ACC_PRESENT OR ACC_CALL_GATE
    36. TASK_ACC  = ACC_PRESENT OR ACC_TASK_GATE
    37.  
    38.  
    39.  
    40. ACS_GRANUL      EQU 10000000b
    41. ACS_DIMENS      EQU 01000000b
    42. DATASEG
    43. DSEG_BEG = THIS WORD
    44.  
    45. GDT_BEG = $
    46. LABEL   gdtr        WORD
    47.  
    48. gdt_0           desc_struc <0,0,0,0,0,0>
    49. gdt_gdt         desc_struc <GDT_SIZE-1,,,DATA_ACC,0,0>
    50. gdt_idt         desc_struc <IDT_SIZE-1,,,IDT_ACC,0,0>
    51. gdt_ds          desc_struc <03fffh,,,DATA_ACC,0,0>
    52. gdt_cs          desc_struc <03fffh,,,CODE_ACC OR ACC_DATAWR,0,0>
    53. gdt_ss          desc_struc <03fffh,00000h,000h,DATA_ACC,ACS_DIMENS,0>
    54.  
    55. gdt_ds32        desc_struc <0ffffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 00Fh              ,000h>
    56. gdt_cs32        desc_struc <0ffffh,00000h,000h,CODE_ACC OR ACC_DATAWR OR ACC_RING0,ACS_GRANUL OR ACS_DIMENS OR 00Fh,000h>
    57. gdt_ss32        desc_struc <0ffffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR ACS_DIMENS OR 00Fh,000h>
    58.  
    59. gdt_dsdebug     desc_struc <0ffffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 00Fh              ,000h>
    60. gdt_csdebug     desc_struc <0ffffh,00000h,000h,CODE_ACC OR ACC_DATAWR OR ACC_RING0,ACS_GRANUL OR ACS_DIMENS OR 00Fh,000h>
    61.  
    62. gdt_all         desc_struc <0ffffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 00Fh              ,000h>
    63.  
    64. gdt_tds32       desc_struc <0ffffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 00Fh              ,000h>
    65. gdt_tcs32       desc_struc <0ffffh,00000h,000h,CODE_ACC OR ACC_DATAWR OR ACC_RING0,ACS_GRANUL OR ACS_DIMENS OR 00Fh,000h>
    66. gdt_tss32       desc_struc <0ffffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR ACS_DIMENS OR 00Fh,000h>
    67. gdt_ssdebug     desc_struc <0ffffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR ACS_DIMENS OR 00Fh,000h>
    68.  
    69. gdt_pzu         desc_struc <007ffh,00000h,080h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 000h              ,0ffh>
    70. gdt_cpzu        desc_struc <007ffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 000h              ,0ffh>
    71.  
    72. gdt_ramq        desc_struc <003ffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 000h              ,080h>
    73. gdt_ramx        desc_struc <003ffh,00000h,080h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 000h              ,080h>
    74. gdt_ramy        desc_struc <003ffh,00000h,000h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 000h              ,081h>
    75. gdt_ramz        desc_struc <003ffh,00000h,080h,DATA_ACC               OR ACC_RING0,ACS_GRANUL OR 000h              ,081h>
    76.  
    77. gdt_tss_main    desc_struc <06bh,,,TSS_ACC,0,0>
    78. gdt_tss_task1   desc_struc <06bh,,,TSS_ACC,0,0>
    79. gdt_tss_task2   desc_struc <06bh,,,TSS_ACC,0,0>
    80. gdt_tss_task3   desc_struc <06bh,,,TSS_ACC,0,0>
    81. gdt_tss_task4   desc_struc <06bh,,,TSS_ACC,0,0>
    82.  
    83. gdt_ds1         desc_struc <00001h,00000h,000h,DATA_ACC               OR ACC_RING3,ACS_GRANUL OR 000h              ,000h>
    84. gdt_cs1         desc_struc <00002h,00000h,000h,CODE_ACC OR ACC_DATAWR OR ACC_RING0,ACS_GRANUL OR ACS_DIMENS OR 000h,000h>;селектор 0e0h
    85. gdt_ss1         desc_struc <00003h,00000h,000h,DATA_ACC               OR ACC_RING3,ACS_GRANUL OR ACS_DIMENS OR 000h,000h>
    далее перехожу в защищенный режим, инициализирую gdt_cs1 (адрес в памЯти, предел), в нем по адресу 01010h размещаю код:
    Код (Text):
    1. stlbpnt PROC    far
    2.   mov   dx, 1070h
    3.   mov   eax,055h
    4.   out   dx, eax
    5.   hlt
    6.   ret
    7. stlbpnt ENDP
    порт 1070h - введен спецально длЯ отладки (это нестандартнаЯ ЏЉ).
    далее перехожу непосредственно на этот код:
    Код (Text):
    1.     DB      09ah
    2.     DD      01010h
    3.     DW      0e0h
    по завершению из порта 1070h читаю 55h. Сдесь все работает на ура.

    А так нет:

    ввожу изменениЯ:
    Код (Text):
    1. ...
    2.  
    3. gdt_cs1         desc_struc <00002h,00000h,000h,CODE_ACC OR ACC_DATAWR OR ACC_RING3,ACS_GRANUL OR ACS_DIMENS OR 000h,000h>;селектор 0e3h
    4.  
    5. ...
    6.  
    7.  
    8.     DB      09ah
    9.     DD      01010h
    10.     DW      0e3h
    После чего сразу выскакивает исключение 13. Порт 1070h остаетсЯ без изменений.

    Что сдесь нетак?
     
  2. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Цитата из intel manual: The JMP instruction cannot be used to perform inter-privilege-level far jumps.
    Для перехода в сторону увеличения CPL предлагаю использовать retf, iret.

    И IOPL = 3? А то in/out сгенерят #GP(0)
     
  3. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Ой, не JMP там =) Неверно опкод вспомнил.
    CALL в сторону увеличения CPL не сработает.
     
  4. zloi7777

    zloi7777 New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2010
    Сообщения:
    5
    про IOPL в EFLAGS, незнал ,спасибо, проверю. заменю на ячейку памяти, коль одна и таже прерва.


    Про CALL: т.е. я прямым вызовом нимогу вызвать целевой сегмент с меньшим уровнем привилегей из сегмента с большими привилегиями?????, я в шоке
    и как быть? что делать?
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Как сказал JAPH -- использовать iret/retf, предаврительно сформировав корректные eflags, ss, esp, cs, eip/ss, esp, cs, eip в стеке.
     
  6. zloi7777

    zloi7777 New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2010
    Сообщения:
    5
    т.е. понизить привилегии гораздо сложнее чем повысить( для повышения делаем шлюз и все ОК), а для понижения нигде неописаный танец с бубноп? ((
    чото это както кривовато.......
    по суте цель защиты - выполнить на привелигированном уровне необходимые действа и передать управление менее превилигированному коду, для которого делегировать некоторые функции через шлюзы и т.д.
     
  7. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Для этого есть ещё Call Gate, Interrupt Gate
     
  8. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    А. Тут понижение нужно. Можно ещё сделать через task gate.
     
  9. zloi7777

    zloi7777 New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2010
    Сообщения:
    5
    Попытался сделать через TSS, все тоже, на без понижения привилегии(ring0), все работает, при понижении до ring3 - все умирает, теперь даже без исключения :dntknw:
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Если бы здесь не исчезали посты, то ты бы уже давно увидел, что я сказал, что ret/iret не "както кривовато", а вполне даже нормально, поэтому не нужно выискивать какие-то другие способы.
     
  11. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Абсолютно правильно. Других документированных способов фактически нет. Переключение задач формально позволяет передать управление на коду с мЕньшим CPL, но по сути это не совсем то, т.к. меняется контекст проца. Sysexit тоже не подходит, т.к. позволяет только
    r0->r3. R2->r3, к примеру уже не пройдет
     
  12. zloi7777

    zloi7777 New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2010
    Сообщения:
    5
    Через TSS все заработало, нашел ошибку при инициализации TSS
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Поздравляю. Вот только что получится, если оценивать производительность этого способа по сравнению с обычным.