FS: Get base virtual address ring3

Тема в разделе "WASM.WIN32", создана пользователем PaCHER, 1 дек 2009.

  1. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Необходимо получить адрес страницы памяти на которую указывает селектор FS в ринг3.

    Нашел несколько возможных способов:
    1) Как делает OllyDbg просто через вызова GetThreadSelectorEntry и получает FS 003B 32bit 7FFDE000(FFF).
    2) Парсинг GDT не подошел изза отсутствия доступа (т.к. ring0)

    Есть ли дополнительные возможности вручную пропарсив, каталог страниц найти указатель на эту страницу памяти, не используя апи?
     
  2. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    например так

    MOV EDI,DWORD PTR FS:[18] ; NT_TIB.Self
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    То есть на парсинг GDT доступа нет, а на парсинг каталога страниц - есть?
    Как так?
    А чем первый не подходит?
     
  4. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    lhc645
    Эт не подходит как как используется адресация с селектором.

    n0name
    А вот так, если читать внимательнее то последняя строчка это вопрос, а не утверждение, и там не написано что доступ на каталог страниц есть.

    А первый не подходит т.к. апи, а надо вручную получить адрес не используя функций и адресацию через FS.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    именно адресацию через fs? push fs/pop es/mov eax, [fs: 0x18] - не пойдет?
     
  6. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    да, адресация через fs не подходит.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Самый рульный способ для ринг3 - GetThreadSelectorEntry.
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Если предположить, что _некоторые_ апи таки можно использовать, а также что в fs лежит селектор, определяющий сегмент, в начале которого лежит TEB – то можно использовать следующее единственно очевидное в таких ужасающих условиях решение: получить карту памяти посредством VirtualQuery (либо готовиться обрабатывать исключения) и проверить верхние валидные адреса на наличие относимых к TEB данных: [XXXXX018] = XXXXX000 (как уже было сказано), текущий esp лежит в пределах StackBase\StackLimit, XXXXXzzz.StaticUnicodeBuffer == "bla-bla-bla" (в этом буфере, видимо, должна находится строка после вызова XxxXxxA апи (не XxxXxxW)).
     
  9. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Планировщик при переключении на новый тред загружает 6-й декриптор(KGDT_R3_TEB) в GDT, устанавливая базу сегмента равной адресу страницы с TEB из ETHREAD. Тоесть значение там уникально для потока. Для одного потока база сегмента там одна, для другого другая. А значит что для определения базы этого сегмента не достаточно селектора, нужен есчо описатель потока. Описатель определяет права доступа к обьекту, через него можно эту инфу получить, соответственно это ThreadDescriptorTableEntry, ну есчо читая из тела обьекта ThreadBasicInformation.
    Для иного случая можно былобы прочитать регистр Cr2, который содержит линейный адрес к которому произошло обращение для #PF(из юзермода через мехонизм исключений, диспетчер получает его значение), предварительно вызвав его. Тогда камень сам бы выполнил суммирование базы сегмента и смещения в нём. Вот только страница с TEB залочена, изменить атрибуты нельзя(ну без хака..). И хардварный останов нельзя поставить(в Dr* нужно загрузить линейный адрес, который и нужно найти %).
    Есчо можно дескрипторный кэш прочитать из регистра Fs. Только тут некоторые проблемы есть. Во первых значение там меняется почемуто на многопроцессорной машине, почему не понятно. Хотя можно пару десятков итераций заюзать, хотябы на одной должна быть сохранена часть дескриптора. Просто Push Fs. Поимеем в стеке часть базы. Во вторых дескрипторный кэш не возможно удалённо получить в юзермоде(в ядре без хака тоже, KeContextToKframes() налаживает маску на сегментные регистры, хак рулит..), тоесть это поле уникально для потока и из другого его не считать(NtGetContextThread не поможет :)).
    Это сигнатурный поиск TEB. Лучше заюзать проверку по Cid.UniqueProcess, в других случаях(чтото отличное от TEB) юзается маркер - пишем его в память, а потом ищем в ней.
    Это шадова буфер.
    Код (Text):
    1.     SwitchToThread()    ; хм..
    2.     ...
    3.     YieldExecution()    ; до!
    4.     push es
    5.     push KGDT_R3_TEB or RPL_MASK
    6.     pop es
    7.     mov eax,es:[TEB.Tib.Self]
    8.     pop es
     
  10. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    поиск в google "dma ring 3"
    Search Results
    1. [PDF] Introducing Ring -3 Rootkits
    by Rutkowska
     
  11. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Folk Acid
    Вам поиск в гугле: http://tinyurl.com/yjp7ebl
    Разве ктото упомянул линус.. Чёто у меня в маздае ядрышко по другому адресу, дма контроллер адресует тока 16М и у него нет режима память-память.. хоть жёсткий диск юзой, какая разница ведь IOPL не поднять, IOPM не доступна. И камень другой, он те инструкции не знает. И что вобще за док, погонь полная пять букоф на строницу ппц, фтопку вместе с Рустовской. Шлак ёпт.)
     
  12. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Вот именно. Вам туда и дорога: http://tinyurl.com/yjp7ebl :derisive:
     
  13. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    CrystalIC
    >Есчо можно дескрипторный кэш прочитать из регистра Fs. [..] Просто Push Fs. Поимеем в стеке часть базы.
    Напомни, пожалуйста, модель твоего P4. Просто "push fs" обычно уменьшает значение указателя стека и кладёт в нижнюю половину дворда селектор, а верхнюю половину либо вообще не изменяет, либо обнуляет. Но чтобы часть часть дескрипторного кэша при этом светилась – первый раз слышим.
     
  14. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Sol_Ksacap
    Не обнуляет. Мы этот вопрос много обсуждали, например на вирустеке с приблежёнными :). На XP на двуядерном пне четвёрки сохраняется в стеке старшая часть сегментных регистров - это дескрипторный кэш. Зависимость по которой значения сохраняемые неизвестна, можно считать рандомным, но очень часто при сохранении регистра Fs сохраняется старшая часть базы сегмента, селектор которого загружен в этот регистр. Непостояноство вероятно вносится вторым ядром, вне зависимости от аффинитета. Знакомый проверял на 7-ке и томже камне - сохраняются нули. Щас проверили на AMD 64 X2 Dual Core 4400 +, XP3 также обнулено. Мы не понимаем сути мехонизма.
     
  15. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    CrystalIC
    Насколько я знаю, речь шла про многократный 'push fs' и осмотр стека после этих операций. Я не проверял на своей машине, но, судя по всему, некоторые процессоры не обнуляют два старших байта при выполнении 'push fs'. В результате то, что ты видел -- просто мусор в стеке, оставшийся после выполнения предыдущих ф-ий. Для чистоты эксперимента стоит посмотреть значения в стеке до выпонения 'push fs' и после. Тогда станет понятно, что там такое.
     
  16. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    и это не смотря на то, что в манах интела сказано, что как минимум для GS/FS должно обнулять старшю часть дворда при внесении в стек
     
  17. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Mika0x65
    Да причём тут стек. Блиа буду дома выложу стопяцот байтный дамп. Это не стек и не сторонние драйвера(у меня всё чисто, ядро отпарсено вручную). Хотя я не проверял/разбирался в мехонизме мне стыдно - просто лень, иных вопросов куча. Что часть дескриптора сохраняет это однозначно(или вы меня долбоёбом считаете, типо не знаю что в стек кладётся..). Gs плвнировщег обнуляет. При возникновении хардварных прерываний маска не налаживается(програмно до, но по ходу мехонизм аппаратный). Впрочем странно что ктото этим интересуется, почемуто мы домоле что про сегментацию уже все забыли давно.. Нормально применима всяко техника которая чётко определена, это чисто теоретический мкхонизм и по тому интересен.
    По сути вопроса - всяко дейстив в третем кольце защиты есть изврощение, там всё ограничено. Единственно необходимый к рассмотрению это режим ядра. В этом случае можно говорить про таблицы директорий, хотя мы читали и из юзермода физическую память непосредственно, но это всё хлам. Легальному приложению нет смысла скрывать контекст и системные вызовы, руткитам не нужен юзермод.
     
  18. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Во стек [​IMG]
    И камень [​IMG]
    Тока не нужно бред про савапконтекст, сепшены при доступе к стеку и прочую белиберду, тотже результат при залоченной памяти и запрещённых прерываниях.
    А вобщем за всё время только один раз у меня возникла необходимость в манипуляциях с регистром Fs. Это в экземплс для полуприватной техники IDP http://paste.org.ru/?004aur
    Иначе смысла нет какието махинации с этим регистром проводить, вобще незачем, можно тупо все треды перечислить, открыть и получить ссылки ли память сканить.
     
  19. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    CrystalIC
    А что было в стеке до 'push fs'? Я полагаю, что там было что-то вроде:

    0012ХХХХ
    001AXXXX
    7C92XXXX

    и т.д.
     
  20. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Нули, поток один. Когдато проверялось через например Pop Ds, затем юзалось прерывание, обработчик делал Push Ds в ядерный стек, затем значение с вешины стека логировалось и выполнялся возврат.