Сейчас на форуме: (+5 невидимых)

 [email protected] —› Протекторы —› Статическая трассировка кода
. 1 . 2 . 3 . 4 . 5 . 6 . >>
Посл.ответ Сообщение


Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 11 декабря 2017 18:39 · Поправил: Boostyq
· Личное сообщение · #1

Всем привет,
Изучаю x86 драйвер, он защищен с помощью vmp
Случай достаточно простой, только некоторые функции мутированы (обфусцированы?), даже нет внешней упаковки
Для того чтобы посмотреть обфускацию целиком, нужна трасса от и до
Дебажить его у меня нет возможности, да и вообще хочу попробовать сделать это статически
Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций (операции стека, прыжки, вызовы), который бы "выполнял" код до тех пор пока не встретиться выход из функции
Правда не ясно что делать c вызовами API, stdcall мы же очищаем стек, но вот с другими соглашениями?
Дело даже не в проте, а вообще в целом
Я пыталась делать парсер конкретных команд под конкретный прот, но дело в том, что это не возможно реализовать, ибо число нелогичных приемов может быть очень большое, поэтому нужно спуститься на самый нижний уровень, для того чтобы выполнять код как сам процессор это делает
Возможно кто-то даст дельный совет, может кто-то уже делал подобное?
Так же я пыталась найти псевдо-код, как процессор выполняет команды, т.к. вмпрот любит использовать редкие команды, может у кого то есть линки?
Спасибо

-----
В облачке многоточия




Ранг: 44.8 (посетитель), 19thx
Активность: 0.040
Статус: Участник

Создано: 11 декабря 2017 18:44
· Личное сообщение · #2

google: symbolic execution. Есть вполне рабочие движки на руби, питоне, жабе, и даже нативные

| Сообщение посчитали полезным: Boostyq


Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 11 декабря 2017 19:01
· Личное сообщение · #3

SegFault

Как вы себе представляете кернел код на питоне ?

Это сразу сломает ось, это вообще возможно запустить в км в принципе ?

> Так же я пыталась найти псевдо-код, как процессор выполняет команды

Тоесть получается что вы не знаете что псевдокод описан в манах по архитектуре, тоесть их никогда не видели(основы). Тогда вы эту задачу решить не сможите, если не знаете базовую архитектуру. В таком случае как можно пытаться снять кернел протектор, это невозможно. У вас скилл не достаточный для данной работы.

> Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций

Виртуальную машину, а точнее визор - да, это способ.)

-----
vx





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 11 декабря 2017 19:10 · Поправил: Boostyq
· Личное сообщение · #4

difexacaw пишет:
Тоесть получается что вы не знаете что псевдокод описан в манах по архитектуре, тоесть их никогда не видели(основы). Тогда вы эту задачу решить не сможите, если не знаете базовую архитектуру. В таком случае как можно пытаться снять кернел протектор, это невозможно. У вас скилл не достаточный для данной работы.

Спасибо за ответ
Я не спорю, что знания совсем не полные, я за обучение в процессе
Но мне кажется я недостаточно верно выразилась
Я не собираюсь эмулировать код, исполнять его как либо, а лишь написать инструмент, который проследит маршрут кода от и до
Архитектура только x86, как основной инструмент ида с питоном
И конечно я понимаю инструкции, но мне гораздо проще читать например код, чем документацию, т.е. не "retn - возврат", а "eip = *(uint32_t *)esp; esp += 4;"
Конечная цель лишь получение трассы от и до у конкретной функции, для дальнейшего статического анализа

-----
В облачке многоточия





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 11 декабря 2017 19:19
· Личное сообщение · #5

Boostyq

А в чём тогда проблема ?
Ставите ловушку и накапливайте лог в бд. С чем именно проблема ?
Как установить ловушку ?
Понятно что получится бд огромного размера и она будет бесполезной, но задача как я понял просто снять трассу.

-----
vx




Ранг: 431.7 (мудрец), 389thx
Активность: 0.730.32
Статус: Участник

Создано: 11 декабря 2017 20:55 · Поправил: dosprog
· Личное сообщение · #6

На основании чeго будут выполняться ветвления?

Это абсурд.

И название темы дурацкое - как трассировка может быть статической?



| Сообщение посчитали полезным: gggeorggge


Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 11 декабря 2017 21:17 · Поправил: Boostyq
· Личное сообщение · #7

dosprog пишет:
На основании чeго будут выполняться ветвления?

Это абсурд.


Привет
Ничего не должно исполнятся
Суть в том, чтобы сохранить трассу для конкретной функции со всеми ветвлениями
Просто протекторы часто мешают кусочки кода и сложно по ним ориентироваться, где-то они разбросаны по доп. секции, так же бывает, что одни и те же участки используются несколькими защищенными функциями, однако если будет цельная трасса, можно это как-то изучать

-----
В облачке многоточия




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 11 декабря 2017 22:00 · Поправил: Модератор
· Личное сообщение · #8

Boostyq пишет: Ничего не должно исполнятся

Самый простой вариант, это берете эмулятор, самый обычный хоть на базе capstone и к эмулятору добавляете ядерные заглушки, есть и статические альтернативы dbi, но там много кодить, очень много.
Настраиваете контекст и эмулируете необходимую вам функцию. Можно допилить pintrace.
Проект от которого можно оттолкнуться https://github.com/marcusbotacin/BranchMonitoringProject
если что то совсем простое, как выше уже писали сойдет symbolic execution.

| Сообщение посчитали полезным: Boostyq


Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 12 декабря 2017 01:09
· Личное сообщение · #9

Тут аналогичная задача, только немного для иных целей --> Link <--

Ну как я и говорил, почему не поставить обычную ловушку и трассировать через классический TF/branch trace не понятно. В км прикрутить классические дби врядле получится, оно всё еле ровно в юм работает

-----
vx





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 12 декабря 2017 02:43
· Личное сообщение · #10

Boostyq пишет:

Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций (операции стека, прыжки, вызовы), который бы "выполнял" код
И
Я не собираюсь эмулировать код, исполнять его как либо

Воу-воу, так будет эмуляция или нет?

Для того чтобы посмотреть обфускацию целиком, нужна трасса от и до

От начала функции и до её конца? После вмпрота? О, ну тогда у меня для вас плохие новости.

Правильно Клерк пишет - не будет такая эмуляция работать. Вы забываете, что в ядре есть много своего АПИ, есть свои структуры и даже fs указывает совсем не туда, куда в юзермоде. Всё ядро будете эмулировать?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 12 декабря 2017 03:02 · Поправил: difexacaw
· Личное сообщение · #11

ARCHANGEL

Задача ведь в выделении кода, целиком процедур. Для этого нужно найти точки входа, исходные адреса для формирования cfg. Трассировка это лишь способ получить эти входы, причём она обеспечивает хорошее покрытие.

-----
vx




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 12 декабря 2017 03:32
· Личное сообщение · #12

ARCHANGEL пишет: Всё ядро будете эмулировать?

чем вариант pemu плох? api совместимо с pin.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 12 декабря 2017 08:29
· Личное сообщение · #13

difexacaw пишет:
Для этого нужно найти точки входа, исходные адреса для формирования cfg. Трассировка это лишь способ получить эти входы, причём она обеспечивает хорошее покрытие.

При пакетной виртуализации функций это дохлый номер. Вы никогда не найдете реальную точку входа в функцию, т.к. её просто нет - каждая вызываемая функция исполняется внутри вм без выхода из неё.

-----
Everything is relative...


| Сообщение посчитали полезным: Gideon Vi, sendersu, VodoleY


Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 12 декабря 2017 11:46 · Поправил: Boostyq
· Личное сообщение · #14

То что дал SegFault полезно, только как я поняла, проблема в том, что нужны входные данные и в зависимости от них, каждый условный прыжок пойдет по одному из 2 вариантов
В то время как мне нужны все ветви, т.е. весь код который может исполнятся при вызове данной функции
Я понимаю, что там могут быть обманные прыжки в никуда, которые никогда не выполняются, но этого я пока не вижу, я делаю это для простой обфускации
Вообще тема сложная для меня, и я хочу начать хотя бы с этого
Поэтому пробую писать скрипт для иды, который управляет стеком, работает с esp, ebp (остальные регистры наверное тоже придется добавить), следит за eip до тех пор пока точка выхода не будет после вызова
Code:
  1. .text:00013978 014                 push    ecx // <--- здесь начинаем
  2. .text:00013979 018                 push    edx
  3. .text:0001397A 01C                 call    Protected2 // тут код уходит в доп. секцию
  4. .text:0001397F 014                 jmp     short loc_1398A // >--- здесь останавливаемся

Я понимаю, что при полной защите вмп все гораздо сложнее, но в моем случае только обфускация
Вот почему я не говорю эмуляция, это просто трассировка кода

-----
В облачке многоточия





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 12 декабря 2017 12:17 · Поправил: Vamit
· Личное сообщение · #15

Boostyq пишет:
.text:0001397A 01C call Protected2 // тут код уходит в доп. секцию

А кто сказал что это вызов функции? В вмпроте практически любой call сначала надо рассматривать как jmp и анализировать код дальше и только если будет из него возврат на следующую инструкцию или он ссылается на чистый код в программной секции, то это call.
Boostyq пишет:
но в моем случае только обфускация

Если функи только обфусцированы и отсутствует виртуализация, то такой код очень просто восстанавливается из под вмпрота руками и головой.

-----
Everything is relative...





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 12 декабря 2017 12:24 · Поправил: Boostyq
· Личное сообщение · #16

Vamit пишет:
А кто сказал что это вызов функции? В вмпроте практически любой call сначала надо рассматривать как jmp и анализировать код дальше и только если будет из него возврат на следующую инструкцию или он ссылается на чистый код в программной секции, то это call.

Именно поэтому я пытаюсь написать трейсер, потому что у вмпрота слишком много трюков которые неочевидны
Code:
  1. Вызов PsGetCurrentProcessId:
  2. .MMQ0:00026F2A 00C                 push    ds:PsGetCurrentProcessId
  3. .MMQ0:00026F30 010                 pop     dword ptr [esp+44]
  4. .MMQ0:00026F34 00C                 push    edx
  5. .MMQ0:00026F35 010                 mov     [esp+8], bh
  6. .MMQ0:00026F39 010                 mov     [esp], dx
  7. .MMQ0:00026F3D 010                 push    dword ptr [esp+48]
  8. .MMQ0:00026F41 014                 retn    52
  9. Прыжок:
  10. .MMQ0:00026EDC 004                 push    dword ptr [esp]
  11. .MMQ0:00026EDF 008                 lea     esp, [esp+30h]
  12. .MMQ0:00026EE3 -28                 call    sub_41076
  13. .MMQ0:00026EE8 -28                 stc

Однако тут я точно уверена, так как этот кусочек кода находится в нормальной функции, а уже при вызове уходит в секцию прота

-----
В облачке многоточия





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 12 декабря 2017 12:27
· Личное сообщение · #17

shellstorm

Вы об этом --> pemu <-- ?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 12 декабря 2017 12:36
· Личное сообщение · #18

Boostyq пишет:
Однако тут я точно уверена, так как этот кусочек кода находится в нормальной функции, а уже при вызове уходит в секцию прота

Вы ошибаетесь, т.к. вмпрот присутствует не только в своих секциях, но и во всех других секциях вместо кусков сожранных им.
Приведенный вами код это обфусцированный вызов апи функции PsGetCurrentProcessId

-----
Everything is relative...





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 12 декабря 2017 12:43
· Личное сообщение · #19

Vamit пишет:
Вы ошибаетесь, т.к. вмпрот присутствует не только в своих секциях, но и во всех других секциях вместо кусков сожранных им.
Приведенный вами код это обфусцированный вызов апи функции PsGetCurrentProcessId

Спасибо, уже установлено

-----
В облачке многоточия




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 12 декабря 2017 14:42 · Поправил: shellstorm
· Личное сообщение · #20

ARCHANGEL пишет: Вы об этом --> pemu <-- ?

Да, этот, есть еще варианты с виртуализацией.

Boostyq пишет: проблема в том, что нужны входные данные и в зависимости от них, каждый условный прыжок пойдет по одному из 2 вариантов

Эта задача относится к фаззингу (при неизвестных входящих параметрах) и покрытию кода.
У этого чувака http://shell-storm.org/ (автор triton) доходчиво и доступно рассмотрены эти квесты.

| Сообщение посчитали полезным: bartolomeo


Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 12 декабря 2017 15:02 · Поправил: Boostyq
· Личное сообщение · #21

shellstorm пишет:
Эта задача относится к фаззингу (при неизвестных входящих параметрах) и покрытию кода.
У этого чувака http://shell-storm.org/ (автор triton) доходчиво и доступно рассмотрены эти квесты.

Вы имеете ввиду исполнять тритоном с указанием параметров, но множество раз и случайными?

-----
В облачке многоточия




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 12 декабря 2017 15:11
· Личное сообщение · #22

Boostyq пишет: Вы имеете ввиду исполнять тритоном с указанием параметров, но множество раз и случайными?

Нет, имею ввиду, что там есть теория с практическими примерами использования symbolic execution, dbi, etc.
Сложность заключается в падениях, вы хотите покрыть все ветви кода, но не все из них рабочие, а движки не боги писали, падают, поэтому нужно пилить систему откатов с сохранением промежуточных результатов.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 12 декабря 2017 18:18 · Поправил: difexacaw
· Личное сообщение · #23

Vamit

Имелось ввиду точки входа в любой исполняемый код(который исполняет cpu), будь там хеловорд, драйвер или вм, разницы нет. Да и вспомните как задача в которой вы участвовали была решена(тот самый вмпрот) - визор выделил(накопил) EP, на основе их через конструктор был сформирован cfg, к нему применена свёртка и на выхлопе массив ваших вм обработчиков, не смотря на огромное число выборок

shellstorm

На 86 есть весьма быстрые и стабильные моторы, так что думаю принципиально реализация не проблема вовсе. Думаю просто вы и тс не знаете с чего начать, не видите общей картины

-----
vx




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 12 декабря 2017 18:39
· Личное сообщение · #24

difexacaw пишет: На 86 есть весьма быстрые и стабильные моторы

Например? Только плиз, без ваших моторов. Не знаю ни одного стабильного движка, а знаю их много. Вот здесь уточню, речь не о частичном покрытии, а о полном, оно в свою очередь зависит от множества факторов, частично проблемы с неполными данными можно решить через фаззинг или посредством солвера, но на это требуется огромное количество времени.
В качестве примера приведу псевдокод:
hash = hash_data(read_user_data_value());
if hash == hash_function()
{
address = function_decrypt();
goto address;
}
в расшифрованной функции может быть куча ветвлений, но здесь есть зависимость от данных и динамического исполнения. Частичное покрытие сделать не сложно, но ТС хочет полное.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 12 декабря 2017 18:48
· Личное сообщение · #25

shellstorm

Ну а чем вам тот же кайт не устраивает(конструктор/билдер), это хороший 86 мотор. Их не так много, что бы выбирать. Да, я не использовал AVL деревья, обычные списки для работы с cfg. Но даже без этого, это весьма шустрый мотор, который не крешит и в км. Это просто как пример, что давно есть стабильные обкатанные моторы. И для трассировки например то же. Полноценные решения. При желании это всё собирается быстро и отлаживается без проблем.

Но тут вопрос в ином имхо. Нужно общее понимание, механизм, какие иснтрументы и для чего. Этого всего нет. А поэтому не имея опыта что то собрать врядле получится. А пилить визоры и конструкторы для км по мойму затея в данном случае провальная.

Добавлено спустя 4 минуты
shellstorm

> в расшифрованной функции может быть куча ветвлений, но здесь есть зависимость от данных и динамического исполнения.

Визор/трассировка даёт локальный cfg, тоесть EP для построения полного возможного графа конструктором. Всё что не включено в динамик и как следствие статик cfg не относится к работе апп, это не вызывается и не используется, например часть индекса массива векторов, которая никогда не вызывается, а таким образом не нужна и исключается. В случае вмп это и не нужно.

-----
vx




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 12 декабря 2017 19:05
· Личное сообщение · #26

difexacaw пишет: Визор/трассировка даёт локальный cfg, тоесть EP для построения полного возможного графа конструктором

Это не то, для построения подобной карты в IDA полно скриптов в том числе есть и заточенные для анализа VM, но это частичное покрытие, но в коде встречаются и jmp reg, что с этим делать при неполных данных?

| Сообщение посчитали полезным: difexacaw


Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 12 декабря 2017 19:14 · Поправил: difexacaw
· Личное сообщение · #27

shellstorm

А причём тут ида, это унылый юм парсер. jmp reg я выше описал. Лайкну вам за то, что у нас одинаковый ход мыслей.

-----
vx




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 12 декабря 2017 19:20
· Личное сообщение · #28

difexacaw пишет: А причём тут ида, это унылый юм парсер.

ТС пишет: Архитектура только x86, как основной инструмент ида с питоном.
В данной задаче IDA это UI с батарейками, а сам движок можно подключить любой, хоть ваш кайт, подключив его к трассировочным интерфейсам IDA.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 12 декабря 2017 19:39 · Поправил: difexacaw
· Личное сообщение · #29

shellstorm

Короче говоря, посмотрим что получится, но а пока я не вижу предмета или задачи для обсуждения

-----
vx





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

Создано: 12 декабря 2017 19:59 · Поправил: Boostyq
· Личное сообщение · #30

difexacaw пишет:
А причём тут ида, это унылый юм парсер. jmp reg я выше описал. Лайкну вам за то, что у нас одинаковый ход мыслей.

Он будет рассчитан верно, если на его генерацию не влияют входные данные
Я пока не буду много говорить, не хочу показаться глупой
Получится - хорошо, если нет - то просто плюс к знанию ассемблера
А так, трейсер поддерживает чтение из стека/дб и запись в стек, скоро буду тестировать, но очень много вариаций инструкций, нужны не все, но многие
---
Такс, ида дает неплохой апи по дизасму, но отвратительный при работе с выражениями типа [ebp+ecx-2C4h]
Реализовала обработку простых команд JMP, J*, CALL, RET, PUSH, POP, но описать даже одну команду ADD с таким апи сложно
Вообщем буду искать движок способный работать с этим проще, или писать что-то свое, чтобы любое выражение просто преобразовывалось в виртуальный адрес и если он относится к виртуальному стеку/статическому адресу/контексту, то записывать/читать в соответствующем месте

-----
В облачке многоточия



. 1 . 2 . 3 . 4 . 5 . 6 . >>
 [email protected] —› Протекторы —› Статическая трассировка кода
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати