Разговорился как-то с modexp про API hashing. Это очень старая техника, самое раннее упоминание, которое нашлось - статья LethalMind в 29A#4 за 1999 год. Суть проста, для того чтобы вирус мог что-то сделать ему нужны системные функции, мы их можем просто перечислить по именам: ws2_32.dll - bind, wininet.dll - InternetOpenA, за что тут же зацепятся антивирусы, потому вместо имен можно сохранять контрольные суммы, тоже достаточно уникальные, потому биконы Metasploit и Cobalt палятся со страшной силой. И уже в 2000 году Z0mbie предложил использовать случайные хеш-функции, и сразу проверять их на коллизии.
Даже сейчас, спустя двадцать пять лет эта нехитрая мысль сбивает большую часть детектов. С другой стороны, если бы я был авером, то я бы обратил внимание на то, что так как значение хорошей хеш-функции не отличимо от случайного, то в 99% 32-битных хешей будет от 10 до 22 единичных битов, и дальше можно ловить конструкции ptr = func(c), ptr(...), где 10 <= popcnt(c) <= 22, или искать высокоэнтропийные блоки, если хеши сложены в массив.
Следующая идея, которая пришла в голову уже мне - не хранить хеши, а воспользоваться фильтром Блума, но с ним другая неприятность. Блуму нужно большое количество разных хеш-функций, что тоже палевно. И тут попалось описание хеш-таблицы, которую придумал Вик Высоцкий в начале 60-х: возмем хеш большей разрядности, чем размер таблицы, и после каждого значения сдвинем побитово по кругу. Размер массива и параметры фильтра можно менять в достаточно широких пределах, и массив будет разреженным. Никаких констант в коде, низкая энтропия, полиморфизм как побочный продукт
Даже сейчас, спустя двадцать пять лет эта нехитрая мысль сбивает большую часть детектов. С другой стороны, если бы я был авером, то я бы обратил внимание на то, что так как значение хорошей хеш-функции не отличимо от случайного, то в 99% 32-битных хешей будет от 10 до 22 единичных битов, и дальше можно ловить конструкции ptr = func(c), ptr(...), где 10 <= popcnt(c) <= 22, или искать высокоэнтропийные блоки, если хеши сложены в массив.
Следующая идея, которая пришла в голову уже мне - не хранить хеши, а воспользоваться фильтром Блума, но с ним другая неприятность. Блуму нужно большое количество разных хеш-функций, что тоже палевно. И тут попалось описание хеш-таблицы, которую придумал Вик Высоцкий в начале 60-х: возмем хеш большей разрядности, чем размер таблицы, и после каждого значения сдвинем побитово по кругу. Размер массива и параметры фильтра можно менять в достаточно широких пределах, и массив будет разреженным. Никаких констант в коде, низкая энтропия, полиморфизм как побочный продукт
🔥138🤔78👍55🥱4
В XZ-бэкдоре, которым "Jia Tan" хотел захватить полинтернета, для поиска строк используется trie, и чтобы оно не занимало сильно много места, к каждой вершине привязан битовый массив с единичками для каждой ветки. Но самый простой способ сериализовать дерево - записать его скобочным выражением. А если ветки перед этим перемешать, то получаем полиморфизм в качестве побочного эффекта. Jia хотел скрытности и в файле и в памяти. Как это ни смешно, это ударило по скорости, из-за чего его и спалили. Если бы он вместо распознающего автомата использовал генерирующий, то может быть и не нашли бы. И код заметно проще
👍142🤔65🥱7
Продолжаю развлекаться с различными способами кодирования. Одна из распространенных антивирусных техник - анализ энтропии семпла, если она высокая, то это говорит о том, что контент сжат или зашифрован, после чего антивирус включает эмкляцию, и ждет пока вирус сам не покажет свое розовенькое беззащитное тельце. Тривиальный способ снизить энтропию - закодировать все в base-64, а алфавит перемешать, и она гарантированно снизится с 8 до 6 бит на символ. Скука.
Другая идея, которая давно уже бродила в злонамеренных вирмейкерских головах - сделать компрессию наоборот, разсжать, то что не сжималось. Если надрессировать модель на текст, то и результат будет похож на текст (в той степени как текст видит модель первого порядка). Никто так ничего и не сделал, наверное потому, что саму таблицу частот нужно где-то хранить, а если модель статична, то и результат будет одинаковым, а вирусы любят разнообразие. Значит нужно сгенерировать вектор с вероятностями, с заданной энтропией - \sum p_i * \log p_i
К счастью, в интернетах нашлись люди, которые заинтересовались бесноватой задачей и написали статью "Generating probabilities with a specified entropy", за что господам Свазеку и Вали большое спасибо. Они решают уравнение E = E + p * \log2 p + (1 - p) * (\log(1 - p))) / (1 - p) шаг за шагом, и полученные корни дают диапазон вероятностей. В конце полученные значения масштабируем, чтобы они суммировались в единицу. Используем получившийся симплекс, как таблицу частот для алгоритма Хаффмана, и готово. Чтобы декодировать, получившийся текст нужно сжать. Сама таблица частот (а ее еще можно перемешать) полностью случайна и никакой информации в себе не несет
Другая идея, которая давно уже бродила в злонамеренных вирмейкерских головах - сделать компрессию наоборот, разсжать, то что не сжималось. Если надрессировать модель на текст, то и результат будет похож на текст (в той степени как текст видит модель первого порядка). Никто так ничего и не сделал, наверное потому, что саму таблицу частот нужно где-то хранить, а если модель статична, то и результат будет одинаковым, а вирусы любят разнообразие. Значит нужно сгенерировать вектор с вероятностями, с заданной энтропией - \sum p_i * \log p_i
К счастью, в интернетах нашлись люди, которые заинтересовались бесноватой задачей и написали статью "Generating probabilities with a specified entropy", за что господам Свазеку и Вали большое спасибо. Они решают уравнение E = E + p * \log2 p + (1 - p) * (\log(1 - p))) / (1 - p) шаг за шагом, и полученные корни дают диапазон вероятностей. В конце полученные значения масштабируем, чтобы они суммировались в единицу. Используем получившийся симплекс, как таблицу частот для алгоритма Хаффмана, и готово. Чтобы декодировать, получившийся текст нужно сжать. Сама таблица частот (а ее еще можно перемешать) полностью случайна и никакой информации в себе не несет
🤔123👍57🔥28🥱3
По поводу предсказывающих моделей, недавно придумал смешную шутку. Jacky Qwerty как-то написал движок, который запоминает последние несколько символов, и пытается предсказать следующий, если угадывает, то пишет единичный бит, если промахивается, то ноль и восемь бит символа целиком. Написал он его на ассемблере, и никто кроме Z0mbie и Modexp и не думал туда заглядывать.
Зомби с идеей разобрался и написал серию движков все с моделями все более высокого порядка. Сперва последние байты, потом таблица вероятностей, диграммы, ну и естественно количество памяти растет куда быстрее чем степень сжатия. Результаты получились такие: текст длиной 2650 байт сжимается в 2271, 1738, 1530 и 1439 байт. Я на это дело посмотрел, и написал "плагин", который использует ноль байт памяти, и при этом сжимает тот же самый текст до 1869 байт.
Смешно же, ну? :-)
Зомби с идеей разобрался и написал серию движков все с моделями все более высокого порядка. Сперва последние байты, потом таблица вероятностей, диграммы, ну и естественно количество памяти растет куда быстрее чем степень сжатия. Результаты получились такие: текст длиной 2650 байт сжимается в 2271, 1738, 1530 и 1439 байт. Я на это дело посмотрел, и написал "плагин", который использует ноль байт памяти, и при этом сжимает тот же самый текст до 1869 байт.
Смешно же, ну? :-)
👍89🤔39🔥19
Пару не дель назад игрался с фильтрами Блума для поиска строк в заранее известном наборе. Для того чтобы уменьшить количество кода можно взять только одну хеш-функцию, и для того, чтобы получить i-ый хеш, просто сдвигать значение по кругу, эту хитрость придумал Выссоцкий из Bell Labs в конце 60-х. А что возьмем в качестве хеш-функции?
И тут и у аверов, и у вирмейкеров одинаково травматичный опыт. Во времена модемов первое что приходило в голову по поводу хешей CRC, циклическая контрольная сумма. Если ей пользоваться как хешом, то результат будет так себе, контрольные суммы нужны чтобы ловить пакеты ошибок (burst error), а для некриптографических хешей важно, чтобы значения распределялись равномерно.
Аверы получили пиздюлину по скорости, а вирмейкеры по детектам. Потому довольно быстро, ну лет за десять примерно, антивирусные движки стали считать ROL-XOR хеши, а вирмейкеры (снова привет Z0mbie) стали генерировать случайные ROL-ADD, ROL-SUB хеши, подбирая константы так, чтобы не напороться на коллизию. И CRC куда уж без него, и там очень смешное с выбором п̶о̶л̶и̶н̶о̶м̶а многочлена, я знаю вы любите это слово со школы.
В случае с фильтром, у нас есть набор строк, и все что нас интересует, чтобы у каждой строки был свой уникальный идентификатор. Потому генерировать хеш мы будем случайно, из одной или нескольких операций "подмешивающих" в хеш текущий символ, и битмиксера (используются в качестве финализаторов во взрослых хешах). В качестве "вращающегося" хеша, мы можем взять битмиксер же, не только ROL/ROR.
Остается проверить фильтр (не только хеш) на коллизии и готово. У нас есть случайная функция, массив со случайными значениями случайного размера, с которым что-то происходит в цикле случайное количество раз, а на выходе мы получаем машинку распознающую заранее заданные строки из известного набора строк.
(Если поиграться с параметрами, то можно даже получить компрессию, на картинке 15 строк длиной 91 байт из 36Кб списка прекрасно умещаются в фильтр длиной 32 байта)
А и все. Чего вы еще ждали в воскреченье утром? Пойду чистить и комментировать код, и зашлю его потом на VXUG
И тут и у аверов, и у вирмейкеров одинаково травматичный опыт. Во времена модемов первое что приходило в голову по поводу хешей CRC, циклическая контрольная сумма. Если ей пользоваться как хешом, то результат будет так себе, контрольные суммы нужны чтобы ловить пакеты ошибок (burst error), а для некриптографических хешей важно, чтобы значения распределялись равномерно.
Аверы получили пиздюлину по скорости, а вирмейкеры по детектам. Потому довольно быстро, ну лет за десять примерно, антивирусные движки стали считать ROL-XOR хеши, а вирмейкеры (снова привет Z0mbie) стали генерировать случайные ROL-ADD, ROL-SUB хеши, подбирая константы так, чтобы не напороться на коллизию. И CRC куда уж без него, и там очень смешное с выбором п̶о̶л̶и̶н̶о̶м̶а многочлена, я знаю вы любите это слово со школы.
В случае с фильтром, у нас есть набор строк, и все что нас интересует, чтобы у каждой строки был свой уникальный идентификатор. Потому генерировать хеш мы будем случайно, из одной или нескольких операций "подмешивающих" в хеш текущий символ, и битмиксера (используются в качестве финализаторов во взрослых хешах). В качестве "вращающегося" хеша, мы можем взять битмиксер же, не только ROL/ROR.
Остается проверить фильтр (не только хеш) на коллизии и готово. У нас есть случайная функция, массив со случайными значениями случайного размера, с которым что-то происходит в цикле случайное количество раз, а на выходе мы получаем машинку распознающую заранее заданные строки из известного набора строк.
(Если поиграться с параметрами, то можно даже получить компрессию, на картинке 15 строк длиной 91 байт из 36Кб списка прекрасно умещаются в фильтр длиной 32 байта)
А и все. Чего вы еще ждали в воскреченье утром? Пойду чистить и комментировать код, и зашлю его потом на VXUG
👍121🤔45🥱11🔥5
Мы всегда готовы помочь россиянам по неосторожности попавшим в долги к старухе-процентщице Путиной. Особенно офицерам ФСБ из 16-го центра. А может и помогли.
👍153🔥60🤔17🤮3
Forwarded from Ukrainian Cyber Alliance
UCA hacked the company Carmoney, which issues secured loans. The company is linked to the ex-wife of dictator Putin, Lyudmila. The infrastructure (hundreds of virtual machines and hundreds of terabytes of data) has been completely destroyed
As a result, we obtained data on a large number of borrowers, including various military units, as well as GRU and FSB, for example, data of employees from the 16th FSB Center (known for its cyberattacks under the names Energetic Bear/Dragonfly)
The company partially acknowledged the hack, stating that "the security system triggered and they shut down the old website." We did. Along with the phones and all the infrastructure. So, the old loan shark should be investigated by regulators — Central Bank and RKN
As a result, we obtained data on a large number of borrowers, including various military units, as well as GRU and FSB, for example, data of employees from the 16th FSB Center (known for its cyberattacks under the names Energetic Bear/Dragonfly)
The company partially acknowledged the hack, stating that "the security system triggered and they shut down the old website." We did. Along with the phones and all the infrastructure. So, the old loan shark should be investigated by regulators — Central Bank and RKN
🔥358👍44👎4🤔1🤮1
Ростовщики из carmoney.ru отрицают то, что они потеряли не только всю инфраструктуру, но и данные всех клиентов, включая и тех, кому в кредите было отказано. Чтобы освежить им память выкладываем небольшой образец данных на тысячу персон. Кто тут у нас "на А"?
Полный комплект, как вы видите на скриншоте с нашего хранилища 12 терабайт. Фото, серия-номер паспорта, телефон, прописка и проживание, кредитная история, иногда даже фото карт с обеих сторон. Все это уже загружено в военные аналитические системы
Полный комплект, как вы видите на скриншоте с нашего хранилища 12 терабайт. Фото, серия-номер паспорта, телефон, прописка и проживание, кредитная история, иногда даже фото карт с обеих сторон. Все это уже загружено в военные аналитические системы
🔥365👍56🥱14
Все именно так и будет. Что касается карманов, то там есть данные не только клиентов, но и тех кому компания отказала. А их гора-а-аздо больше (можете оценить количество папочек в предыдущем посте). Но это приятные мелочи по сравнению с тем, что будет с мамонтами, которых оббирает Людмила Путина, а как будут использованы данные военных и спецслужб, то совсем другая история, от которой деньгами не откупиться
👍204🔥95🥱5🤔4