eXeL@B —› Оффтоп —› Xakep жжот |
Посл.ответ | Сообщение |
|
Создано: 08 сентября 2011 14:52 · Личное сообщение · #1 Попался в руки журнальчик, сижу читаю: Это значит, что 8 байт из стека уйдут, и указатель esp опустится на 8 байт выше. А восемью байтами ниже, по правилам игры, должен находиться указатель на наш переписанный SEH-заголовок, только на четыре байта выше, где должен быть указатель на следующее звено SEH-цепочки. Таким образом, retn возьмет указатель на наш переписанный указатель и вернет ему управление, то есть eip будет указывать на переписанный нами стек на то место, где должен быть указатель на следующий SEH. Поэтому вместо указателя надо писать туда инструкцию JMP +0x12 (это для того, чтобы перепрыгнуть указатель на SEH-дескриптор, который у нас четырьмя байтами дальше). Я не шарю в сплойтах? ----- Yann Tiersen best and do not fuck | Сообщение посчитали полезным: diver1991 |
|
Создано: 08 сентября 2011 14:55 · Личное сообщение · #2 |
|
Создано: 09 сентября 2011 01:32 · Поправил: Isaev · Личное сообщение · #3 |
|
Создано: 09 сентября 2011 19:37 · Личное сообщение · #4 |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 11 сентября 2011 01:44 · Личное сообщение · #5 PE_Kill пишет: Это значит, что 8 байт из стека уйдут, и указатель esp опустится на 8 байт выше. А восемью байтами ниже, по правилам игры, должен находиться указатель на наш переписанный SEH-заголовок, только на четыре байта выше, где должен быть указатель на следующее звено SEH-цепочки. Таким образом, retn возьмет указатель на наш переписанный указатель и вернет ему управление, то есть eip будет указывать на переписанный нами стек на то место, где должен быть указатель на следующий SEH. Поэтому вместо указателя надо писать туда инструкцию JMP +0x12 (это для того, чтобы перепрыгнуть указатель на SEH-дескриптор, который у нас четырьмя байтами дальше). перечитываю уже в который раз...это увлекательно! |
|
Создано: 11 сентября 2011 19:48 · Личное сообщение · #6 |
|
Создано: 12 сентября 2011 07:10 · Личное сообщение · #7 |
|
Создано: 12 сентября 2011 19:46 · Личное сообщение · #8 |
|
Создано: 12 сентября 2011 20:12 · Личное сообщение · #9 |
|
Создано: 12 сентября 2011 21:32 · Личное сообщение · #10 |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 15 сентября 2011 15:36 · Личное сообщение · #11 Crawler пишет: кстати, я тоже чего-то про эксплоиты писал в хакер лет стопиццот назад. знаем-знаем, читали например |
|
Создано: 15 сентября 2011 23:35 · Личное сообщение · #12 |
|
Создано: 17 сентября 2011 18:26 · Поправил: ARCHANGEL · Личное сообщение · #13 Та, это всё - цветочки. Выпуск 06 (149) 2011. Программерские типсы и триксы. Мало того, что аффтор не понимает, что такое форвардинг, так он ещё и новый способ обхода ядерной SeSinglePrivilegeCheck придумал из юзермода. Уже б хоть проверяли, что пишут. Куда там цензура смотрит, это же могут прочесть дети! ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 18 сентября 2011 08:26 · Личное сообщение · #14 |
|
Создано: 18 сентября 2011 23:45 · Поправил: bowrouco · Личное сообщение · #15 > Инструкции Sysenter и Int хотя являются процедурными ветвлениями(Sysenter и Int 0x2e вызывают Nt-процедуру в ядре, выполняя некоторый механизм вызова, иные Int вызывают ISR, по этому являются процедурными ветвлениями), но в данной модели графа(базовый граф) рассматрива ются как линейные инструкции по той причене, что они возвращают управление на следующую за ними инструкцию(Sysenter выполняет возврат на адрес, определённый в USD), не содержат непосредственно адреса процедуры, не привязаны к расположению в адресном пространстве(можно коп ировать как линейный блок) и не изменяют флажки(при возврате из сервисов EFlags восстанавливается). Иначе потребуется вводить новый тип описателя, либо использовать описатели процедурных ветвлений, помечая их как закрытые ветвления. > Учитывая что Cx-ветвление Jecxz не изменяет регистры, то может использоваться также, как не Cx-ветвление(например Jz). Для этого услов ие J.BRANCH_CX_FLAG и J.Condition = !Ecx. В описателе условие определено в KitFlags(маска JCC_TYPE_MASK): KitFlags & JCC_TYPE_MASK = 3( JCC_ECXZ). Так как установлен флаг BRANCH_CX_FLAG, то база для формирования опкода JCX_OPCODE_BASE(0xE0), таким образом, опкод 0xE3. Для инструкции Jz условие: KitFlags & JCC_TYPE_MASK = 4(JCC_Z). База выбирается в зависимости от типа ветвления(Short/Near, определяется фла гом BRANCH_SIZE_MASK). Если ветвление короткое, то база JCC_SHORT_OPCODE_BASE = 0x70 и соответственно опкод 0x74. При использовании преф икса 0x67 (флаг JCC_X16_MASK) условие(мнемоника Jcxz) в инструкции Jecxz изменится(ветвление если !Cx, старшее слово в регистре Ecx не проверяется). Очевидно, что условие, при котором выполняется переход, определяется не опкодом, а набором флагов в описателе. > Сервисный шлюз KiFastSystemCall() загружает в регистр Edx ссылку на аргументы сервиса и исполняет инструкцию Sysenter. Возврат из серв иса выполняется на адрес ntdll!KiFastSystemCallRet(), по которому находится инструкция Ret, возвращающая управление в Zw-стаб. Так как адрес KiFastSystemCallRet находится за инструкцией Sysenter, то возврат выполняется на следующую за Sysenter инструкцию: KiFastSystemCall: mov edx,esp sysenter KiFastSystemCallRet: ret Очевидно, что такое расположение точки выхода KiFastSystemCallRet() делает инструкцию Sysenter линейной. При ином расположении следующая за Sysenter инструкция не будет исполнена, поэтому Sysenter завершает ветвь. > Так как граф не изменяется(положение описателей относительно начала графа постоянно, в данном случае относительно втор ого описателя блока примитивов в CxReplaceTable), а перемещается в памяти(в конец графа для которого выполняется морфинг) , то каждая из локальных ссылок(это например ветвление jz @f в блоке $Loopdne) вставляемого блока изменяется на одинако вое значение. Доказательство: Пусть I – ссылка на копируемый описатель в графе с базой G. Аналогично I’ – ссылка на вставляемый описатель в графе с базой G’(описатель, который адресуется ссылкой I в графе G копируется в граф G’ по адресу I’). Пусть смещение базы графа G' относительно графа G равно Delta, тоесть G’ = G + Delta. Смещение описателя I относительно начала графа G равно I - G. Так как граф, описывающий копируемый блок не изменяется, то I - G = I' - G’. Таким образом I - G = I’ - (G + Delta). Отсюда I' = I + Delta. Прибавление константы не нарушит равенство I' + sizeof(Gp) = I + Delta + sizeof(Gp). Так как сле дующий за I описатель J находится в линейном графе, то J = I + sizeof(Gp). Учитывая предыдущее равенство, заключим что J' = J + Delta, тоесть разница смещений описателей в двух графах равна смещению баз графов. Для каждой ссылки выполняется поправка I’.Flink = I.Flink + Delta. Тоже и для обратной ссылки Blink и ссылки на ветвь BranchLink. GCBE engine, (c) Indy, 2011. Но вы ведь все желаете знать эту матчасть, не смотря на слишком подробное обьяснение |
|
Создано: 19 сентября 2011 00:00 · Личное сообщение · #16 |
|
Создано: 19 сентября 2011 03:20 · Личное сообщение · #17 |
|
Создано: 19 сентября 2011 22:48 · Личное сообщение · #18 |
|
Создано: 20 сентября 2011 01:30 · Личное сообщение · #19 |
|
Создано: 20 сентября 2011 10:09 · Личное сообщение · #20 |
|
Создано: 20 сентября 2011 20:47 · Поправил: bowrouco · Личное сообщение · #21 PE_Kill Я понимаю почему вам утверждение из первого поста вызывает усмешку. Относительно сложный технический материал, написанный не техническим языком, разбавленный левыми фразами сложен для восприятия. Разум пытается осознать смысл, причём изза длинных фраз, в которых много левых слов и вообще построенные не на техническом языке он входит в своеобразный ступор, иногда говорят про "разрыв шаблона". Такое обычно вызывает ответную реакцию, в виде усмешки. Это намеренное или нет отвлечение, призванное сделать чтение комфортным, но мешает пониманию. Именно по этому я например стараюсь как можно более короткими делать высказывания. > указатель esp опустится на 8 байт выше. А восемью байтами ниже, по правилам игры, должен находиться указатель на наш переписанный Я знаю эти механизмы фактически досконально, но не понимаю что имеет ввиду автор, именно изза кривого построения предложений. В школу пусть идёт русский язык учит |
|
Создано: 20 сентября 2011 21:39 · Личное сообщение · #22 |
|
Создано: 20 сентября 2011 23:28 · Личное сообщение · #23 |
|
Создано: 21 сентября 2011 06:21 · Личное сообщение · #24 |
|
Создано: 21 сентября 2011 10:31 · Личное сообщение · #25 bowrouco Пользуясь случаем, хотелось бы уточнить термины. Граф (связный) - множество вершин, соединённых между сосбой множеством ребёр. Задаётся, как правило, матрицей смежности, инцедентности или Киргхофа. Ссылка - указатель, разыменовываемый неявно. Описатель - номер элемента в некотором заранее заданном массиве объектов. Пусть I – ссылка на копируемый описатель в графе с базой G Что значит граф с базой? Правильно ли я понял фразу: указатель, разыменовываемый неявно, который указывает (косвенно) на копируемый объект в графе, начало которого расположено по некоему адресу, который называется базой? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 21 сентября 2011 19:30 · Личное сообщение · #26 |
|
Создано: 21 сентября 2011 21:41 · Поправил: bowrouco · Личное сообщение · #27 ARCHANGEL Всё гараздо проще. Граф в данном случае это код без ветвлений. Ветвления представляют собой узлы графа, тоетсь это просто список, где имеются простые операции(mov eax,ebx etc.). Он может быть сложным(не базовый граф), тогда конструктор является декомпилятором и это уже весьма сложная задача. В таком случае граф описывает не машинные команды, в отличае от базового графа, а псевдокод - это примитивы, как например запись/чтение памяти в форме, зависящей от модели графа. Я просто скопипастил выше несколько примечаний из одного дока, не думал что возникнут вопросы. Вообще не следует это изучать, без полного текста этот кусок не имеет смысла. |
eXeL@B —› Оффтоп —› Xakep жжот |