Сейчас на форуме: Kybyx (+2 невидимых) |
eXeL@B —› Оффтоп —› syser - а он еще нужен? |
<< . 1 . 2 . 3 . 4 . 5 . 6 . >> |
Посл.ответ | Сообщение |
|
Создано: 26 декабря 2016 00:08 · Личное сообщение · #1 есть мысль себе в портфолио добавить хоть что то, что можно показать на паблик из всего что сделано или делается или будет делаться, почти ничего на паблик показывать нельзя вспомнил про Syser,его можно, могу восстановить соурсы ядра дебагера, которое общее для Ring3 и Ring0 (кто помнит у Syser два дебагера, ring3 и ring0, знают все только ring0, про ring3 мало наверное кто помнит, он был бесплатен) ну и сам Ring3 часть как рабочий дебагер, можно и всю Ring0, но мне это не интересно ну и все конечно на гитхаб собственно вопрос, а дальше это кому то интересно? подхватить,развивать итд, гуи дебагер для ядра еще живы ? |
|
Создано: 16 мая 2017 08:45 · Поправил: shellstorm · Личное сообщение · #2 reversecode пишет: да там код простой до безобразия При O2 нормальный код будет и скорее всего заинлайнится. Тестил на 2008 все сводится к cmp byte [esi],bl setn al. Вот так лучше не делать bool CALLME(void *Buffer, int i ). void* это хз какой тип, поэтому компилятор втыкает регистр под размер адреса, BYTE* существенно меняет картину, CALLME(Buffer|i|) \ CALLME(BYTE Buffer) еще лучше, компилятор все развернет до 16 битных регистров. reversecode пишет: я еще помню был жесткий баг в ГЦЦ как миниум Тоже писал багрепорт, версия GCC если не изменяет память была 4.3 не всегда корректно разворачивал свитч с if-ми внутри в которых были довольно сложные битовые сравнения, выкидывал часть условия даже с выключенной оптимизацией, что естественно приводило к неработающей программе. |
|
Создано: 16 мая 2017 09:58 · Личное сообщение · #3 shellstorm пишет: Вот так лучше не делать bool CALLME(void *Buffer, int i ). что значит не делать, это аля memcpy который то char* то long* может использовать Добавлено спустя 8 минут что там лежит в стеке сразу после фолта ? +8 CS +4 EIP +0 ERROR так ? push 0Eh call _HandleInterrupt_sub_19FFC lea esp, [esp+4] ничего не меняет, стек остался на месте pushf +4 pusha +20 затолкали флаги и регистры +24 дальше забираем указатель на наш стек mov ebp, esp и увеличиваем стаек на два дворда lea esp, [esp-8] в первый записываем указатель на стек mov [ebp-4], ebp во второй адрес фолта mov eax, cr2 mov [ebp-8], eax и переползаем по указателю на стек в верх add dword ptr [ebp-4], 28h и ... вот здесь я не понял. где мы в итоге на dword ptr [ebp-4] оказываемся ? +24h мы пропускаем все флаги+регистры +4 еще выше поднимаемся по фловому фрему, получается на сам EIP ? если так то дальше не складывается... а если так то дальше в логике все ок, должны быть на указателе на стеке с ошибкой тогда mov eax, [ebp-4] это указатель на стек с ошибкой push dword ptr [eax] сама ошибка а уже в функции call _from_int_14_sub_62076 выгребается с [eax+4] уже EIP |
|
Создано: 16 мая 2017 10:29 · Личное сообщение · #4 |
|
Создано: 16 мая 2017 13:16 · Личное сообщение · #5 |
|
Создано: 16 мая 2017 15:06 · Личное сообщение · #6 |
|
Создано: 16 мая 2017 15:39 · Личное сообщение · #7 https://pastebin.com/hhc2XSx8 собственно зачем это все затеяно хотелось понять что за данные приходят в функу call dword ptr [eax+44h], которая является обработчиком с цикле дебаг ядра в сисере Code:
один аргумент это адрес фолта cr2 а вот второй это тот eax который является аргументом Pa3 и который берется [edx+4] и судя по логике это должен быть EIP почему EIP потому что есть еще функа https://pastebin.com/1CaMY17N в которую тоже передается Code:
и в которой [eax+4] уже черпается EIP адреса функций из самого сисера Code:
вот по логике вроде так а по математике не сходятся подсчеты со стеком либо в стеке после фолта данные как то не так ложатся.. я хз, вроде гуглил но не нашел описания фолтового фрейма Добавлено спустя 14 часов 16 минут все таки наверное я ошибся это не чистые функи с IDT это патченные, потому что в этих нет вызова оригинальных виндовых.... |
|
Создано: 17 мая 2017 07:58 · Личное сообщение · #8 Вроде разобрался. Еще до первой команды хэндлера - push 0Eh - где-то происходит уменьшение указателя стека на 4. Это становится очевидно, если взглянуть на конец функции: popa popf lea esp, [esp+8] or dword ptr [esp+8], 100h iret Т.е. после popf указатель стека указывает не на код ошибки, а на 4 байта ниже. Поэтому всё правильно - после add dword ptr [ebp-4], 28h в [ebp-4] указатель на код ошибки, а не на EIP. Получается, что после фолта до выполнения этого кода выполняется что-то еще. P.S. Очень интересно зачем сисер при возврате из обработчика PF# устанавливает TF в образе EFLAGS в стеке (or dword ptr [esp+8], 100h) |
|
Создано: 17 мая 2017 12:47 · Личное сообщение · #9 |
|
Создано: 17 мая 2017 17:40 · Поправил: reversecode · Личное сообщение · #10 оказывается в сисере можно закладками дата вью и коде вью открывать могу и альфу для тестов сбилдить если кому захочется позапускать бп ставить по коду можно, степ трейсы работают.... окна стека и вотча еще пустые.... десяток не очень нужных комманд наполнить... типа скопировать память, сравнить память итд и попап меню с дата вьюва еще не работает и окно брекоинтов расширенное еще пустует.. донабить и можно релизить Добавлено спустя 7 минут spinz пишет: Очень интересно зачем сисер при возврате из обработчика PF# устанавливает TF в образе EFLAGS в стеке может поймать трапом обработку пока копал ring0, нашел что там есть branch tf который ставят в MSR интересная штука... только в ring3 там заглушка... нашел что можно вроде и в ring3 такое запустить http://www.openrce.org/blog/view/535/Branch_Tracing_with_Intel_MSR_Registers надо будет попробовать заимплементить хотя можно же и софтово реализовать ? дизасмом смотреть опкоды бранчей и генерить брекпоинт Добавлено спустя 2 часа 3 минуты печаль гугл пишет что NtSystemDebugControl на win7 x64 уже не пашет.. http://rsdn.org/forum/winapi/4421811.hot Добавлено спустя 2 часа 9 минут и в тоже время народ пишет что and here a link to an article about the easy ring3 method: http://fdbg.x86asm.net/article_DebugCtlMSR_backdoor_in_win64.txt a bit long reading, so in shortcut: for enabling branches in win x64, just set some bits in debug 7 register (DR7.LE, DR7.GE). That's all ! Simple, huh? Unbelievable and funny? No, that way really works under current versions of x64 windows. т.е. через DR7 у них работает интересно а на 32битах .... dr7 под ring3 же доступен насколько я помню ?... Добавлено спустя 2 часа 21 минуту https://github.com/x64dbg/x64dbg/issues/227 https://www.codeproject.com/Articles/517466/Last-branch-records-and-branch-tracing http://www.rcollins.org/secrets/DR7.html сохраню для себя |
|
Создано: 19 мая 2017 06:37 · Личное сообщение · #11 |
|
Создано: 19 мая 2017 07:25 · Поправил: reversecode · Личное сообщение · #12 механизм TF на выходе как я понимаю должен использоваться к обработке BP через PF# где я раньше спрашивал если посмотреть то TF ставится если функа _from_int_14_sub_62076 возвращает 1 Code:
а 1 она возвращает только когда находит что то там в каком то своем списке (возможно расширенные BP) https://pastebin.com/kSXqF199 и по TF она уже попадет в свой int1 или int3 трап где видимо как то продолжит обработку BP Добавлено спустя 18 часов 56 минут в чем магический смысл 0xCC и 0xCD 0x03 только в размерности ? проц одинаково их обрабатывает ? |
|
Создано: 02 июня 2017 20:48 · Поправил: reversecode · Личное сообщение · #13 кручу верчу ring0 сисер обдумываю сколько усилий нужно что бы добить до ring0 что бы нарисовать сисер в ring0 0) переписать std::map 1) графика вроде все просто, банальные хуки функций ддрав 2) клава, мышь для емуляции и работа с портам кода много разного, но вроде без асма 3) хуки ИДТ (той же клавы и мыши) вот тут наверное сложнее есть асм, и без него никуда, для x86 студия инлан асм поддерживает, а вот что делать для x64, непонятно писать на голом асм лениво смотрел диагонально интрисики, что то есть, но хз есть ли все как минимум iret там нет 4) APIC и мульти ядерность вообще забыл эту тему, даже не понимаю еще что там сисер чудил но видно по коду есть в IDT инструкций lock cmp,lock add и не ясно можно ли обойтись без мультиядерности пока просто рисованием и обработкой миши и клавы для полноценного дебагера 1) куча версий ядер нт, для детекта MiCopyOnWrite вроде даже обычными плюсами обойтись можно, асма нет 2) хуки ИДТ для всех остальных int, 1,3,14 и кучу еще всяких по моему даже пустых в реализации без асма вообще никак 3) несколько разных заумных функций копирования итд которые разбавленны разным асм кодом, popfd pushfd и прочим врядли без асма обойти 4) несколько заумных функций трансляции адреса (наверное) даже если их реверснуть, пока не понятно можно ли будет портировать на x64 адресация памяти, место резервации ядер итд, наверняка перебито по новой а по коду много всяких v10 = (4 * (Address >> 22) - 0x3FD00000); v13 = (4 * (Address >> 12) - 0x40000000); v4 = (((Address >> 18) & 0x3FF8) - 0x3FA00000); v4 = (((Address >> 9) & 0x7FFFF8) - 0x40000000); итд и хрен на глаз поймешь зачем это надо 5) заумные функции read(b,w,d) write(b,w,d) memcmp итд разбавлены коды возврата через stc clc, без асма вообще хз как такое в С С++ реализовывать и самое интересное, я почти уверен что сисер писали только асм инлайнами, как же они повыкручивались там в этих ситуациях.. | Сообщение посчитали полезным: ClockMan |
|
Создано: 03 июня 2017 02:23 · Личное сообщение · #14 |
|
Создано: 03 июня 2017 12:25 · Поправил: reversecode · Личное сообщение · #15 замысловато ты написал, я даже не понял хорошо это или плохо помню что ты боролся с сисером и его #PF но бажность сисера не в этих асм закрутках а в невнимательности логики использования своих же указателей например у меня сисер часто валился на калькуляторе, видимо какие то деления на ноль, не разбирался потом есть всякие использование не проинициализированых указателей, поклацать на отображения айпи в дизасме, и он валится итд в своей версии фикшу, если такое нахожу в оригинальной вообщем хочется степ бранчей полез в гугл нашел что dbgeng.dll умеет dbgeng.h #define DEBUG_STATUS_STEP_BRANCH 8 потом залез в саму длл покопал чуток Code:
Code:
угу, либо через nt.dll а мы знаем что оно обрезано с некоторых версий винды либо через какой то драйвер гугл рассказал и это https://www.yumpu.com/en/document/view/54775013/draw-me-a-local-kernel-debugger/17 http://www.ivanlef0u.tuxfamily.org/?p=382 https://github.com/sogeti-esec-lab/LKD но то чего хочется раскопать, а именно кто и как легально юзает msr через SetContext в спец битах DR7 и как это заюзать самому, по быстрому не нашлось... по трейсил бы кто SetContext до самого ядра ?)) и если биты устанавливаются в msr, то почему дебаг евенты не приходят в юзермод импортируемых вызовов SetContext даже не просматривается в dbgeng.dll, а жаль.... за то увидел что протокол общения с интерфейсом com порта(если мечтать о виртулке ring0) и общения с драйвером kldbgdrv сидит в этой длл, хотя олеком какие то цепляются по ходу пьесы... Добавлено спустя 16 минут https://twitter.com/painter701 не знаю что за чел, но приятно что кто то проявил инициативу))) | Сообщение посчитали полезным: shellstorm |
|
Создано: 04 июня 2017 16:30 · Личное сообщение · #16 reversecode > кто и как легально юзает msr через SetContext в спец битах DR7 Code:
Это у амд отображение управляющих бит мср на др. Поэтому можно запустить этот механизм из юм загрузкой dr7 в контексте. При свопе потоков или при переключении мода(возврате в юм) - Kei386EoiHelper() etc, не происходит перезагрузка мср, таким образом записав принудительно мср и запустив механизм трассировки ветвлений он начнёт выполняться для всех потоков в системе(без BTS_OFF_OS начнётся трассировка ядра). Поэтому нужно написать дров, который будет управлять данным процессом. Добавлено спустя 15 минут > в чем магический смысл 0xCC и 0xCD 0x03 Это ловушка(trap), поэтому в ISR передаётся адрес следующей инструкции, но система его не правильно фиксит: Code:
Отматывается один байт назад, это правильно для CC, но не для CD с префиксами или двубайтному. Добавлено спустя 18 минут > хотя можно же и софтово реализовать ? дизасмом смотреть опкоды бранчей и генерить брекпоинт Можно, я уже где то писал про такое. Но железячная трассировка ветвлений хороша из за профайла. А можно есчо по простому сделать, если профайл не важен - трассируем как обычно(TF) и продолжаем до обнаружения ветвления. ----- vx |
|
Создано: 04 июня 2017 16:59 · Поправил: reversecode · Личное сообщение · #17 |
|
Создано: 04 июня 2017 17:01 · Поправил: difexacaw · Личное сообщение · #18 |
|
Создано: 04 июня 2017 17:03 · Личное сообщение · #19 так я еще раз повторяю, причем здесь amd ? в интела все тоже самое, даже по коду фокус в том что не работает, ранее чал копал, и вроде наткунлся что в старых кернелях была проверка на тип проца, и как он подметил, видимо документация из интела не дошла в МС по новым процам, и там забыли добавить новые типы для возможности записи msr через dr7 |
|
Создано: 04 июня 2017 17:31 · Поправил: difexacaw · Личное сообщение · #20 reversecode > может их проц по другому ловит и обрабатывает ? Разницы заметной нет, кроме не существенных деталей(не проверяет IOPL из V86). Допустим у нас последовательность F3 CD 03. При останове Ip = 03. Нужно идти назад и найти начало инструкции, а при серии префиксов это не всегда возможно сделать. > причем здесь amd ? в интела все тоже самое Да нет же, эта фича даже не описана в мане амд(том 2). Я давно читал в какой то их спецификации, но не помню где. На Интеле это не сработает, я проверял на i5. Выше в коде посмотрите имена полей dr7: DR7_TRACE_BRANCH or DR7_LAST_BRANCH. У Интела этих бит нет. ----- vx |
|
Создано: 04 июня 2017 17:40 · Личное сообщение · #21 у интела и amd есть msr и оно поддерживается ( во всяком случае это можно проверять через cpuid) dr7 поля, это мапинг, эти поля устанавливаются из ring3 и через SetContext, ядро ловит эти установки и перекладывает на msr был бы ядреный дебагер или бы я был профспецом по windbg, я бы уже взял да проверил доходят ли эти установки из ring3 в ring0 или ломаются на каких то проверках |
|
Создано: 04 июня 2017 18:01 · Личное сообщение · #22 |
|
Создано: 04 июня 2017 18:14 · Личное сообщение · #23 |
|
Создано: 04 июня 2017 18:33 · Личное сообщение · #24 А чем обычная трассировка не устраивает. Можно блок линейный выделить, но это дизасм длин нужен. 7517_04.06.2017_EXELAB.rU.tgz - bt.rar Добавлено спустя 1 час 2 минуты Вот есчо через HWB. Можно напрямую блок выполнить в буфере, принципиально разницы нет. eec9_04.06.2017_EXELAB.rU.tgz - bt2.rar ----- vx |
|
Создано: 04 июня 2017 21:16 · Личное сообщение · #25 |
|
Создано: 04 июня 2017 21:45 · Поправил: difexacaw · Личное сообщение · #26 А что мешает собрать простейший драйвер для операций с мср ? В 8-ке кстате есть такой код: Code:
Может как то и можно через это из юм заюзать bt, ссылок много на функу, но должен быть запущен верифер. ----- vx |
|
Создано: 04 июня 2017 22:50 · Личное сообщение · #27 |
|
Создано: 04 июня 2017 23:18 · Личное сообщение · #28 |
|
Создано: 05 июня 2017 14:11 · Личное сообщение · #29 |
|
Создано: 05 июня 2017 18:13 · Личное сообщение · #30 хм полез в 64 битное ядро, таки да доступ к msr присутсвует Code:
так что если что, можно пытаться через nt dll вскочить, если там нет заглушек в ring3 |
|
Создано: 05 июня 2017 19:07 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . 4 . 5 . 6 . >> |
eXeL@B —› Оффтоп —› syser - а он еще нужен? |