|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 20, 2004 21:43:32 Всем Zzдар0ва! И сразу хитрая замутка... не могу понять как это работает, смотрите nop <- останавливаюсь здесь nop pushad push TTT push dword [fs:0] mov dword [fs:0], esp int 1 nop TTT: pop dword [fs:0] add esp, 8 jmp NNNОстанавливаюсь в указанном месте и делаю так: с помощью !idt вытаскиваю обработчик int1 и командой eb (не bpx) изменяю его первый байт на 0xCC. Также ставлю бряк на обработчике ТТТ и включаю i3here on. Теперь вроде логично - если топнуть F8, то возникнет прерывание int1, т.к. проц находится в режиме трассировки, и сработает поставленный бряк 0xCC т.е. сосулька выльется внутри обработчика int1. А теперь совсем не логично... - если вместо F8 топнуть F5, то (!?!?!?) сначала сработает бряк на ТТТ и только потом поставленный бряк 0xCC в обработчике int1... Так кто же тогда обрабатывает int 1 сгенерированное прогой ;(... Либо я совсем ничего не понимаю (что скорей всего) либо обработчик int1 заменяется другим... |
|
|
Дата: Май 20, 2004 22:26:50 в таких страшных эхспериментах нельзя F5, надо CTRL-D |
|
|
Дата: Май 21, 2004 17:38:59 Godness Этот хитрый замутка был притаранен из времён ms dos/real mode. Смотреть у Крис Касперски "Техника и философия хакерских атак". Прикольный замут !!!! |
|
|
Дата: Май 21, 2004 21:01:20 je_ Слово нельзя не употребляю ;)... К тому же CTRL-D или F5 - один хер... хотя попробую, но думаю будет тоже самое... CARDINAL Да ну перестань - буду я искать эту книжку в бесконечных просторах инета ради одного вопроса. Сам бы прочитал и рассказал, что за замут ;)... |
|
|
Дата: Май 21, 2004 23:13:49 раз пишу знамо есть разница.. |
|
|
Дата: Май 22, 2004 04:42:12 в "Технике и философии" такого не было, во всяком случае в первом издании. А вот во втором уже было. Если кратко, то push label/push fs:[0]/mov fs:[0],esp устанавливает обработчик структурных исключений на label, а int 1 как раз такое исключение и вызывает. без отладчика, int 1 эквивалентен goto label, а с отладчиком... увы! большинство отладчиков подавляет генерацию исключения по int 1, обрабатывая ее самостоятельно, поэтому управление никуда не передается... если на int 1 повешан расшифровщик, то под отладчиком программа остается нерасшифрованной. выход (применительно к soft-ice) трассировать программу через аппаратные точки останова - благо он это позволяет. P.S. а обработчик int 1 надо смотреть (в данном случае!) командной xframe |
|
|
Дата: Май 22, 2004 08:51:18 kaspersky Простите, Сэр, обшибся может маленько. Но ведь помню, видел это уже и в Вашей же книжке... |
|
|
Дата: Май 22, 2004 11:22:41 Godness 1. дебуггер всё-же может не ответить на бряк в собственном коде; (видно вы пользуетесь iceext? тогда может iceext игнорирует?) |
|
|
Дата: Май 24, 2004 20:53:52 · Поправил: Godness Вау! Кто тут нас посетил - сам товарищ kaspersky :)))... Спасибо за краткое введение в теорию SEH'ов, но я итак ее неплохо знаю. Вы недочитали мой пост до конца! Недоразумение совсем в другом... je_ И в ответ на Ctrl-D тоже самое - сначала срабатывает обработчик SEH, а потом бряк внутри int1. Говориш что сразу не реагирует на 0xCC, но ведь потом то реагирует - и смысл? Если обработчик int1 в idt заменяется другим, то это значит, что IceExt тоже показывает неправльный обработчик int1 в idt (ну как и сосулька показывает ntoskrnl!Kei386... а, там на самом деле ntice!.text)... Таааак, похоже столь "простенькой" задачкой я поставил всех в неловкое молчание :))). Не люди - это же реальная непонятка!? Черт - хочется разобратся, а ведь лень то как! Думал, может кто уже знает ответ... Sten'а случайно поблизости не видели, может он приподнимет завесу тайны... |
|
|
Дата: Май 24, 2004 21:26:01 вы должны попробовать на чистом SICE. или собственный код сделать, который гарантированно выдаст правду.. |
|
|
Дата: Май 25, 2004 06:16:08 Godness Ты мне по порядку скажи, что делаешь, а то я совсем запутался. Ты говоришь, что смотришь !idt. Так вот, тебе эта команда до задницы, т.к. айс сам хватает int1/3 (и кучу остальных), а тебе показывает бывшые вектора (от ntoskrnl). Впрочем, ты и сам это знаешь. Во-вторых, уже у мя к тебе вопрос. Реентерабельность прерывания, говоришь? Что происходит при прерывании в прерывании? В-третьих. Я бы на твоем месте не парил себе мозги, а поставил бы бряк с помощью айса в самом айсе (в нужном тебе обработчике прерывания). Для этого тебе придется отключить запрет на постановку бряков внутри самого айса. Потом узнаешь адрес в IDT. Посчитаешь VA. Влепишь бряк. Возможная трудность: пересчитать сумму заголовка в PE, иначе падченый айс не будет загружен. |
|
|
Дата: Май 27, 2004 23:12:07 Volodya, как же тебя легко запутать... А что непонятно, я вроде все толком обьяснил - даже мне самому понятно (местами :) >Ты говоришь, что смотришь !idt. Так вот, тебе эта команда до задницы, т.к. айс сам хватает int1/3 (и кучу остальных), а тебе показывает бывшые вектора Немного противоречиш себе - iceext ведь перенаправляет два прерывания на свои обработчики, ну и показывает их так как они есть на самом деле... вроде... >поставил бы бряк с помощью айса в самом айсе (в нужном тебе обработчике прерывания) Дык что же я и пытаюсь сделать. Т.е. ставлю бряк 0xCC в обработчике int1 и ожидаю что он сработает. Но срабатывает он только тогда, когда трейсиш прогу пошагово, но не срабатывает если приложение ring-3 пытается выполнить инструкцию int 1. >или собственный код сделать, который гарантированно выдаст правду Ну так я теперь и сделал, но только еще больше стал ничего не понимать... Смотрите, делаю так !idt Interrupt Descriptor Table for CPU0 IDTBase=8003F400 Limit=07FF 0000 IntG32 0008:F41CBFDE DPL=0 NTice!.text+00086C5E 0001 IntG32 0008:F40131B0 DPL=0 iceext!.text+5D30 ... u F40131B0 F40131B0 cmp dword [F40417D4], 0 F40131B7 jz F40131BF F40131B9 call [F40417D4] ...подпачил его следующим образом F40131B0 jmp F4041C04 F40131B5 nop F40131B6 nop F40131B7 jz F40131BF F40131B9 call [F40417D4] ... F4041C00 dd 00000000 F4041C04 inc word [F4041C00] F4041C0B cmp dword [F40417D4], 0 F4041C12 jmp F40131B7т.е. никаких бряков - теперь будет наверняка инкрементироваться переменная F4041C00... И таки да - она инкрементируется если трассировать любой попавшийся код. Но если хоть сто раз подряд запустить прогу, которая пытается выполнить инструкцию int1 - хрен там, переменная F4041C00 как была нулевой, так и осталась... Ну теперь логично предположить, что сосулька перед появлением на экране перенастраивает таблицу idt, как бы приготавливаясь к режиму трассировки, устанавливая обработчики, которые мы видим командой !idt. Я просто запустил драйверок, который скопировал idt до и после появления сосулки, вот он: format PE native entry start include '%fasminc%\win32a.inc' ;+++++++++++++++++++++++++++++++++++++++++++++++++++; section '.data' data readable writeable notpageable rdt_old rd 4 idt_old rd 8 rdt_new rd 4 idt_new rd 8 section '.code' code readable executable notpageable start: pushad ;до появления сосулки cld sidt fword [rdt_old] mov esi, dword [rdt_old + 2] mov edi, idt_old mov ecx, 8 repz movsd db 0xCC sidt fword [rdt_new] ;после появления сосульки mov esi, dword [rdt_new + 2] mov edi, idt_new mov ecx, 8 repz movsd popad mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret 8 ;+++++++++++++++++++++++++++++++++++++++++++++++++++; section '.reloc' fixups data readable discardableТаблица и регистр ridt как были одними и теми же так и остались - ничего не перенастраивается. Ну и что?! Тык значит, что инструкция int 1 сгенерированная кодом ring-3 не попадает в обработчик int1, а обрабатывается либо обработчиком invalid'ных команд или обработчиком привелигерованных команд. Ну а как еще?!?! |
|
|
Дата: Май 27, 2004 23:21:14 je_, на вы не надо! Не первый день на форуме ;)... volodya >Реентерабельность прерывания, говоришь? Что происходит при прерывании в прерывании? Значит реентерабельность... тааак, пойду за толковым словарем... Ну че, че, че... че? Сохраняет кажись состояние задачи (регистры, стек и т.п.) и переключается на обработку прерывания, если конечно новое прерывание имеет более высокий приоритет, кажись... В защищенке я еще пока не больно шарю... Четко усвоил только одно - бряк 0xCC в обработчике int3 лучще не ставить :-) |
|
|
Дата: Май 27, 2004 23:37:17 подождите! А у INT01 DPL-то какой!? |
|
|
Дата: Май 27, 2004 23:44:42 Айс меняет DPL int 1. iceext восстанавливает его назад. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.091 |