upx что это njrat
Распаковка исполняемых файлов
Привет, хабровчане. В рамках курса «Reverse-Engineering. Basic» Александр Колесников (специалист по комплексной защите объектов информатизации) подготовил авторскую статью.
Также приглашаем всех желающих на открытый вебинар по теме «Эксплуатация уязвимостей в драйвере. Часть 1». Участники вебинара вместе с экспертом разберут уязвимости переполнения в драйверах и особенности разработки эксплойтов в режиме ядра.
Статья расскажет о подходах к анализу запакованных исполняемых файлов с помощью простых средств для обратной разработки. Будут рассмотрены некоторые пакеры, которые применяются для упаковки исполняемых файлов. Все примеры будут проведены в ОС Windows, однако изучаемые подходы можно легко портировать на любую ОС.
Инструментарий и настройка ОС
Для тестов будем использовать виртуальную машину под управлением ОС Windows. Инструментарий будет содержать следующие приложения:
установленный по умолчанию плагин x64dbg Scylla;
Самый быстрый и простой способ провести распаковку любого исполняемого файла — применить отладчик. Но так как мы будем также рассматривать язык программирования Python, то может понадобится проект:
uncompile6 проект, который позволяет разобрать байткод виртуальной машины Python;
pyinstallerExtractor инструмент для распаковки архива pyInstaller.
Общие методы снятия паковки
Разберемся, что же такое паковка. В большинстве случаев исполняемые файлы современных языков программирования имеют довольно большой размер при минимальном наборе функций. Чтобы оптимизировать данную величину, можно применить паковку или сжатие. Наиболее распространенный на сегодняшний день пакер — UPX. Ниже приведен пример того, как пакер проводит сжатие исполняемого файла.
На картинке может показаться, что файл стал по размеру больше, однако это не всегда так. Большинство файлов за счет такой модификации могут уменьшить свой размер до 1.5 раз от исходного объема.
Что же от этого реверс-инженеру? Почему надо знать и уметь определять, что файл упакован? Приведу наглядный пример. Ниже приведен снимок файла, который не запакован:
И файл, который был пропущен через алгоритм UPX:
Изменения коснулись в этом случае двух основных точек исполняемого файла:
Точка входа — в случае с упакованным файлом это начало алгоритма распаковки, настоящий алгоритм программы будет работать только после того, как будет распакован оригинальный файл;
Код оригинального файла: теперь не найти паттернов, которые можно сразу разбирать как команды.
Итак, чтобы снова анализировать оригинальный файл, нужно найти настоящую или оригинальную точку входа. Для этого нужно разбить алгоритм на основные этапы:
Этап подготовки исполнения файла — загрузчик ОС настраивает окружение, загружает файл в оперативную память;
Сохранение контекста — упаковщик сохраняет контекст исполнения файла (набор значений регистров общего назначения, которые были установлены загрузчиком ОС);
Распаковка оригинального файла;
Передача управления оригинальному файлу.
Пример UPX
Попробуем с помощью отладчика найти оригинальную точку входа для приложения. Запечатлим оригинальную точку входа до упаковки UPX:
Как та же точка входа выглядит после упаковки:
Запустим отладчик и попробуем найти место сохранения контекста:
Ждем первого использования ESP — в отладчике при этом значение регистра подсветится красным цветом. Затем устанавливаем точку останова на адрес и просто запускаем приложение:
В результате попадаем на оригинальную точку входа:
Вот так просто, теперь используя плагин Scylla Hide можно сохранить результирующий файл на жесткий диск и продолжить его анализ.
Подобный метод можно применять для любого упаковщика, который сохраняет контекст на стек.
Пример PyInstaller
Не всегда подобный подход работает для приложений, которые используют более сложную структуру исполняемого файла. Рассмотрим файл, который был создан с помощью PyInstaller — пакет, который позволяет преобразовать Python скрипт в исполняемый файл. При генерации исполняемого файла создается архив, который содержит виртуальную машину Python и все необходимые библиотеки. Сам исходный код приложения при этом преобразуется в байт код и его нельзя дезассемблировать.
Попробуем все же получить что-то читаемое. Создадим простое приложение на Python и упакуем с помощью PyInstaller. Исходный код приложения:
Установим пакет pyInstaller и создадим exe файл:
Итак, проведем сбор информации о том, что в итоге получилось. У нас есть архив, который должен запустить виртуальную машину, и код, который мы записали в виде скрипта. Попробуем восстановить исходник и просто его прочесть даже без запуска.
Таким образом можно снова получить исходный код.
Смотреть открытый вебинар по теме «Эксплуатация уязвимостей в драйвере. Часть 1».
Иследование несложных crackme’s (часть 3)
Здравствуйте, Хабралюди.
Представляю вам третью часть из моего цикла статей о исследовании крякмисов. В этом топике мы поговорим с вами о ручной распаковке некоторых пакеров и о преодолении не сложных антиотладочных методов.
1. Ручная распаковка
Теория
Запакованная программа работает следующим образом:
Сначала запускается код распаковщика, который начинает расшифровывать запакованый програмный код. После окончания расшифровки делается прыжок на OEP программы и далее начинает выполняться уже распакованный програмный код.
Алгоритм распаковки будет таков:
1. Находим RVA OEP.
2. Дампим программу.
3. Восстанавливаем таблицу импорта.
4. Меняем точку входа на оригинальную.
Практика
В этой статье мы рассмотрим два пакера. Это UPX и ASPack. Распаковка других пакеров не сильно будет отличаться от распаковки этих двух.
Скачиваем самую свежую версию. Пакуем что — нибудь. Запускаем это под отладчиком.
Во время расшифровки запакованного кода пакер во всю использует стек. Естественно, чтобы запакованная программа работала правильно, пакеру необходимо сохранить начальное значение стека и потом, после завершения распаковки, восстановить его. Практически во всех упаковщиках, когда они восстанавливают стек перед переходом на OEP, считывается значение в стеке по адресу esp-4.
Таким образом, в Olly ставим бряк командой «hr esp-4». Затем запускаем программу и видим, что бряк сработал тут:
Далее трассируем программу до OEP(грубо говоря становимся на OEP). С помошью плагина Olly Dump дампим программу.
Теперь осталось только восстановить импорт.Запускаем нашу запакованную программу и ImpREC. В списке процессов ImpREC’a находим нашу программу. В поле RVA вводим RVA OEP( выше описано как его найти). Нажимаем AutoSearch. После появления сообщения о том, что скорее всего что — то найдено нажимаем Get Imports и, если в списке появились функции, то нажимаем Fix Dump и выбираем наш дамп. Вот и всё программа распакована.
ASPack
Тут всё аналогично, за исключением некоторого момента. После установки бряка мы попадаем сюда:
0046F416 75 08 JNZ SHORT Test_Com.0046F420
0046F418 B8 01000000 MOV EAX,1
0046F41D C2 0C00 RETN 0C
0046F420 68 C08F4500 PUSH Test_Com.00458FC0 //кладём в стек OEP
0046F425 C3 RETN // Косвенно переходим на OEP
В остальном процедура одинакова.
Крякмис на тему распаковки
Вот этот крякмис.
Распаковываем так как описано выше. Всё отлично распаковывается.(Для справки OEP = 00401000). После этого савим бряки на вызов функции GetDlgItemTextA, запускаем, вводим фейковый пасс, нажимаем на кнопку и попадаем сюда:
В EAX у нас находится длина введённого пароля. Командой SHL al,3 мы выполняем логический сдвиг значения AL влево на 3 и в идеале мы должны получить 78.Проведём процедуру обратную shl. Это shr 78,3 = 0F = 15 длина валидного пароля. Дальше я очень долго трассировал до некоторого момента и на пути мне встретилось несколько антиотладочных трюков:
Инструкция RDTSC возвращает в регистр EAX количество тактов с момента последнего сброса процессора. В коде выше мы видим два вызова этой инструкции а потом сравнение разницу их выводов с неким эталонным значением. Дело в том, что, когда программа выполняется без отладчика, разность тактов будет мала, а когда она под отладчиком то разность будет большая. Подобных моментов вам встретится много, просто пачте их или меняйте флаги. Когда вы до трассируете до следующего момента:
Обратите внимание на 0040127C. Тут совершается прыжок на несуществующий адрес, поэтому смело патчим переход на 00401281. Таких моментов будет несколько. Трассируете до такого кода:
004014F1 0FB613 MOVZX EDX,BYTE PTR DS:[EBX] ; наш пароль сейчас находится по адрессу расположенному в EBX, и сейчас мы заносим первый символ нашего пароля в EDX
004014F4 B9 08000000 MOV ECX,8
004014F9 AC LODS BYTE PTR DS:[ESI] ; подгружаем в EAX какой-то символ
004014FA 24 01 AND AL,1 ; and 1 с этим символом
004014FC 74 04 JE SHORT crackme2.00401502
004014FE D0E2 SHL DL,1
00401500 72 08 JB SHORT crackme2.0040150A
00401502 D0E2 SHL DL,1
00401504 0F82 BF020000 JB crackme2.004017C9 ; прыжок на плохую ветку программы
0040150A ^E2 ED LOOPD SHORT crackme2.004014F9
0040150C 43 INC EBX
0040150D 58 POP EAX
0040150E 48 DEC EAX
0040150F 0F84 9A020000 JE crackme2.004017AF
00401515 50 PUSH EAX
00401516 ^EB D9 JMP SHORT crackme2.004014F1
Над этим моментом я очень долго думал. Оказалось, что это процедура генерации пароля. То есть пароль хранится в программе не в открытом виде. AL на протяжении всей генерации принимает значения 1 или 0. Так вот, протрассировав всю процедуру генерации пароля и выписав все значения, я получил огромную строку из двоичных значений(для удобства перевёл в десятичную систему):
119 101 108 108 100 111 110 101 85 102 105 110 100 109 101
учитывая то, что каждая восьмёрка символов(в двойчной строке, а я перевёл в десятичную, поэтому тут это каждый символ обрамлённый пробелом), генерировалась после того, как мы положили в EDX определённый символ нашего введённого пароля, то можно утверждать что строка выше и есть валидный пароль. Перекодировав её получилось «welldoneUfindme».
2. Некоторые антиотладочные методы
Антиотладочных методов очень много, начиная с этой статьи будем разбирать их по очереди, от простых к сложным.
Итак, на crackmes.de как раз есть специальный крякмис, который называется AntiOlly. Качаем его, запускаем и видим следующее окошко:
Тут нам говорят, что ничего не обнаружено и мы справились. Теперь мы имеем представление о том, как выглядит «хорошее» сообщение. Загружаем крякмис в Olly и видим следующее:
Ошибка вызвана тем, что Olly, проанализировав заголовок нашего крякмиса, нашла в нём(заголовке) ошибки. Но это поправимо. Загружаем наш крякмис в PE edior и переходим во вкладку Optional header. Моё внимание привлекло «слишком большое» значение параметров NumberOfRVAandSize, Base of Code и Base of Data. Обычно NumberOfRVAandSize = 0x00000010, Base of Code =00001000, Base of Data = 00002000. Меняем эти параметры на «обычные» и запускаем крякмис под отладчиком. Теперь ругательного сообщения не видно(т.е. оно осталось, но никак не повлияет на анализ) и мы можем спокойно анализировать крякмис. Итак, это была первая антиотладочная уловка.
Запустив крякмис под отладкой мы видим «плохое» сообщение:
Проанализировав программу мы находим участок антиотладочного кода:
00401010 |. FFD7 CALL EDI // Вызываем функцию GetTickCount
00401012 |. 6A 00 PUSH 0
00401014 |. 68 34214000 PUSH AntiOlly.00402134
00401019 |. 8BF0 MOV ESI,EAX
0040101B |. FF15 DC204000 CALL DWORD PTR DS:[4020DC] //FindWindowA
00401021 |. 85C0 TEST EAX,EAX
00401023 |. 75 04 JNZ SHORT AntiOlly.00401029
00401025 |. 884424 0F MOV BYTE PTR SS:[ESP+F],AL
00401029 |> FF15 04204000 CALL DWORD PTR DS:[402004] //IsDebuggerPresent
Итак, первая вызывается функция GetTickCount. Эта функция возвращает время, которые прошло с момента старта системы в милисекундах. Дело в том что есть ещё один вызов этой функции. Далее, в последующем коде, замеряется разница между значениями полученными в результате выполнения этих функций. Это была вторая антиотладочная хитрость.
Далее следует вызов FindWindowA, которая ищет окно с заголовком OllyDbg. Ну и наконец вызов IsDebuggerPresent, которая просто проверяет отлаживается программа или нет. Если да то в Eax 1 если нет то 0.
вот проверки, которые проводит крякмис:
0040102F |. 85C0 TEST EAX,EAX // эта проверка после функции IsDebuggerPresent
00401031 |. 75 02 JNZ SHORT AntiOlly.00401035 // если дебаггер есть то прыгаем на 00401035
00401033 |. 32DB XOR BL,BL //если нет то обнуляем BL
00401035 |> FFD7 CALL EDI //Второй раз вызываем функцию GetTickCount
00401037 |. 2BF0 SUB ESI,EAX
00401039 |. 83FE 64 CMP ESI,64 // Сравниваем значения
0040103C |. 76 0D JBE SHORT AntiOlly.0040104B // Если ok то прыгаем на 0040104B
0040103E |. A1 44204000 MOV EAX,DWORD PTR DS:[402044]
00401043 |. 50 PUSH EAX
00401044 |. 68 3C214000 PUSH AntiOlly.0040213C
00401049 |. EB 3F JMP SHORT AntiOlly.0040108A // если не ok то идём по плохой ветке
0040104B |> 84DB TEST BL,BL
0040104D |. 74 14 JE SHORT AntiOlly.00401063 // Проверка результата функции IsDebuggerPresent
0040104F |. 8B15 44204000 MOV EDX,DWORD PTR DS:[402044]
00401055 |. A1 60204000 MOV EAX,DWORD PTR DS:[402060]
0040105A |. 52 PUSH EDX
0040105B |. 68 3C214000 PUSH AntiOlly.0040213C
00401060 |. 50 PUSH EAX
00401061 |. EB 2E JMP SHORT AntiOlly.00401091
00401063 |> 807C24 0F 00 CMP BYTE PTR SS:[ESP+F],0 //Проверка на то нашлось ли окно функцией FindWindow
00401068 |. 74 15 JE SHORT AntiOlly.0040107F
Думаю теперь понятно где патчить или редактировать регистры.
Большое спасибо вам за внимание.
Как пользоваться NjRAT? Приколы вируса удаленного доступа
Zip File, мамкины хацкеры. Сегодня мы наконец-то поговорим про ратники. Рассмотрим их основные функции, нюансы открытия портов, варианты решения проблемы с DynDNS и прочие вещи, которые так волнуют начинающих злоумышленников. Оговорочка по Фрейду. Конечно, же безопасников, а не злоумышленников. Ведь именно специалистам, отвечающим за защиту, приходится выявлять крыс на компьютерах в своих больших и малых конторах.
Для тех, кто не в теме, проведу краткий экскурс в историю. Ратники, они же Remote Access Trojan (трояны удаленного доступа) или попросту крысы, применяются хацкерами для получения доступа к ресурсам компьютера. По сути, это вирусные утилиты, разработанные по образу и подобию админских программ для обслуживания по удалёнке. Таких, как RAdmin, TeamViewer, TightVNC и прочие известные всем нам ремотки.
Однако принцип внедрения у ратников несколько отличается от вышеперечисленного софта. Для того, чтобы установить тот же RAdmin, вам, как минимум нужно побывать за компьютером пользователя 1 раз. Либо обладать правами на установку прог по сети. TeamViewer при первом запуске также выдаст рандомный пароль с уникальным ID, а для дальнейшего подключения без участия пользователя потребуется войти под своей учеткой.
В любом случае, ваш доступ к машине будет так или иначе санкционирован. Ратники же, имея под капотом вирусный бэкграунд, требуют от юзверя лишь запустить их единожды. После этого информация о соответствующем ПК отлетит прямиком к злоумышленнику, который в свою очередь сможет распорядиться полученным доступом по своему усмотрению.
Вот и образовалось, что называется свободная касса для всех любителей поживиться чужими данными. На форумах в дарке, эту тему форсят ещё с апреля и на сегодняшний день ситуация мало чем изменилась. Разве что ратников стало больше, чем раньше и продавать их стали за бабки. Причём функционал у них у всех плюс-минус одинаковый, а отличаются они лишь графической оболочкой.
В данном уроке, я продемонстрирую вам наиболее популярный ратник NjRAT. Он имеет самое большое количество скачиваний на гитхабе, поэтому очень надеюсь, что комментариев типа «ааа вирус нам скидываешь» не будет. Ведь я не заливаю данный ратник в телегу, а показываю, где его может скачать потенциальный злоумышленник и каким образом использовать для своих целей. Если интересно, устраивайтесь по удобней и приступим к созданию крыски. Погнали.
Шаг 1. Заходим на гитхаб и загружаем архив с NjRAT’ом.
Шаг 2. Распаковываем Zip File и внутри созданного каталога ищем папочку Moded, а в ней файл ратника.
Шаг 3. Запускаем его и прописываем порт, который нам нужно будет открыть на роутере. Надеюсь, что не нужно объяснять то, что он же, должен быть добавлен в исключения вашего брандмауэра. Хотя лично я, всегда вырубаю последний, дабы не выносить себе, и без того утомлённый мозг, этим вопросом. А по поводу проброса портов, у меня на канале есть чудеснейший видос про RDP. Там суть один в один, поэтому растягивать данный ролик по времени разжёвываю эту тему, я тут не буду. Кто не шарит, переходите и смотрите по ссылке в подсказке.
Шаг 4. Ну а мы жмём Start и попадаем в основное окно программы. Тут нас интересует только одна кнопка – «Builder». После нажатия на неё, запускается меню конфигурирования EXE’шки клиента, которая, по сути, и является вирусом. Давайте настроим всё по порядку. В пункте Hostзадаём наш белый IP’шник. Я миллион раз повторял в своих видео, что если вы хотите заниматься изучением администрирования или безопасности на постоянной основе, то обзавестись белым IPу провайдера нужно в обязательном порядке. Далее у нас порт, открываемый на роутере. Чуть ниже имя жертвы. Маскировка под определённый процесс. Обычно злоумышленники маскируют ратник под какую-нибудь системную службу, аля служба печати или диспетчер задач. Ну а справа у нас дополнительные параметры вируса. BSODпри попытке закрытия, копирование в автозагрузку, запись в реестре, распространение по USB в случае подключения носителя к ПК и прочие прелести. В более продвинутых ратниках ещё встречается функция изменения иконки, FUD-крипт и т.д. Ниже размер логов. Пусть будет 512. В принципе, всё. Кликаем «Build» для создания файла.
Шаг 5. Указываем имя и месторасположения. Я назову RAT, однако ясен-красен, что для распространения такое имя уж точно не годится и вы никогда не встретите подобную EXE’шку в чистом виде. По поводу максировки вирусов в меня на канале также есть пару занятных роликов. Ссылка на один из них непременно всплывёт в подсказке.
Шаг 6. Окей. Запускаем файл на компьютере жертвы.
Шаг 7. И вернувшись на свой ПК проверяем статус подключения. Комп подключился, а значит наш вирус уже в системе, и мы можем начинать кошмарить её по полной программе. Для этого достаточно вызвать контекстное меню функций и выбрать наиболее подходящий нам вариант.
Шаг 8. Давайте рассмотрим всё по порядку. Первый пункт Manager предоставляет нам доступ к файлам на дисках, открывает менеджер процессов, в котором мы можем выключить ту или иную задачу, а также посмотреть текущие соединения и поковыряться в регистре.
Шаг 9. Функция «Run File» позволяет запустить любой файл с диска или по внешней ссылке. Давайте я для примера продемонстрирую жертве пикчу носков.
Шаг 10. Указываем путь к картинке. И затем проверяем результат на клиенте.
Шаг 11. Всё отрабатывает. Теперь давайте затестим удалённый рабочий стол. Подключившись с его помощью можно не только смотреть за происходящим, но также, как и в любой популярной удалёнке управлять мышкой, клавой и делать скриншоты.
Шаг 12. Про вебку и микрофон думаю объяснять не нужно. Это, пожалуй, одни из самых полезных функций для злоумышленников, живущих за счёт продажи компромата в даркнете.
Шаг 13. Хотя, как по мне, большинству хацкеров ничуть не меньше зайдёт функция «Get Passwords». Она вытаскивает все сохранённые пассы из браузеров. Т.к. у меня это виртуалка, соответственно тут данный список девственен и чист.
Шаг 14. Далее по списку у нас старый добрый кейлоггер. Он перехватывает все нажатия клавиш пользователя. От набивки текста унылейшей курсовой, до пароля в vk.
Шаг 15. А затем сейвит их в отдельный RTF’овский файл, который складывается в папку пользователя, рядом с TXT’шкой пассвордов.
Шаг 16. Ну и самое весёлое – это, конечно же, чат с жертвой. Вы можете пообщаться с беднягой, пообещав удалить троянчик с компьютера за пару сотен пиастров.
Шаг 17. И в случае удачной сделки, даже сдержать своё слово, мочканув вредонос удалённо.
И вроде бы, с первого взгляда, всё круто, однако, не стоит забывать о подводных камнях. Во-первых, для того, чтобы всё завелось, на компьютере жертвы должен быть либо отключён автивирус. Либо ваш EXE-файл должен быть прокриптован. Во-вторых, на сегодняшний день, львиная доля членов нашего братства, жидится потратить сотку на белый IP и тем самым добавляет себе гемороя с пробросом портов.
Да, чисто теоретически можно попробовать воспользоваться популярным сторонним сервисом No-IP и с помощью технологии DynDNS забацать себе псевдо-белку. Также у некоторых именитых сетевых вендеров есть свои собственные, бесплатные сервисы для этой истории. Например, у тех же ASUS данная фича прекрасно работает из коробки. Однако, никакой дин вам не поможет, если ваш гавно-провайдер по экономическим соображениям экономит пул, и посадив клиентов за NAT, раздаёт, что называется «many to one».
В этом случае, вам поможет только белый IP или VPN. Либо, если у вас есть собственный Web-сайт, можно попробовать поизголяться с online-ратниками. Они хоть и менее функциональны, зато не требуют открытия портов. Следующий ролик у нас, как раз, будет по этой теме. Так что, если ты, друг мой, впервые забрёл на канал и ещё не оформил подписку, сейчас самое время. Клацай на колокол и в твоей ленте будут регулярно появляться годнейшие видосы по вирусологии, этичному хакингу и пентестингу.
С олдов жду лайки и конечно же комментарии по поводу того, какие ратники вы используете в своих обучающих целях. На сегодняшний день их развелось просто офигеть, как много, поэтому давайте посредством народного голосования выберем лучший. Хотя я почти на 100% уверен, что лидером окажется Putin RAT, но всё же давайте ради приличия немножко поиграем в иллюзию демократии. Напоследок, традиционно, желаю всем удачи, успеха и самое главное, безопасной работы.
Берегите себя и свои тачки. Не допускайте крыс в свою ОСь. Самый лучший способ для этого раз и навсегда перейти на Linux и больше никогда не вспоминать об EXE-файлах. Ну а с вами, как обычно, был Денчик. Искренне благодарю за просмотр. До новых встреч, камрады. Всем пока.