• XSS.stack #1 – первый литературный журнал от юзеров форума

Viva la Морфер

Получаем число 3 или 9 из любого числа на входе.

2) Возьми его и два следующих за ним числа и сложи (то есть если загадал число 21 - берешь 21 22 и 23 и складываешь - у меня получилось 66)
Я, наверное, слишком въедливый, но всё же...

Имеем:
result = x + (x + 1) + (x + 2) = 3x + 3
Напишем немного кода, проверим:

Python:
def numsum(num):
    length = len(str(num))
    result = 0
    for i in range(0,length):
        result = result + int(str(num)[i])
    if len(str(result)) == 1:
        return result
    else:
        return numsum(int(result))

for i in range(1, 100):
    x = 3*i + 3
    result = str(numsum(x))
    if(result != str(3) and result != str(9)):
        print (str(x) + ' = ' + result)

Вывод:


Код:
python3 proof.py
6 = 6
15 = 6
24 = 6
33 = 6
42 = 6
51 = 6
60 = 6
69 = 6
78 = 6
87 = 6
96 = 6
105 = 6
114 = 6
123 = 6
132 = 6
141 = 6
150 = 6
159 = 6
168 = 6
177 = 6
186 = 6
195 = 6
204 = 6
213 = 6
222 = 6
231 = 6
240 = 6
249 = 6
258 = 6
267 = 6
276 = 6
285 = 6
294 = 6

Выходит, получаем 3, 6 и 9, а не 3 и 9.
 
Реализация стоит больше 5к(которые ещё не гарантированно, что получишь, ибо конкурс). Мб в одни руки да. Но не всем же)
но и эта статья не тянет даже 1 бакс, тут только домыслы, даже примитивного примера реализации нету
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вот простецкий алгоритм генерации мат.операций с заданным числом операций:
Генерируем n-1 случайных чисел, вставляем случайные знаки между ними и подсчитываем результат.
Если результат больше, чем нужное нам число - из всего выражения вычитаем подсчитанное нами число, больше - прибавляем.
*n - число мат операций

На реализацию около 50 строк кода на Си ушло. Идея Haunt, описывалась в соседней статье
 
Вот простецкий алгоритм генерации мат.операций с заданным числом операций:
Генерируем n-1 случайных чисел, вставляем случайные знаки между ними и подсчитываем результат.
Если результат больше, чем нужное нам число - из всего выражения вычитаем подсчитанное нами число, больше - прибавляем.
*n - число мат операций

На реализацию около 50 строк кода на Си ушло. Идея Haunt, описывалась в соседней статье
Но разговор то не о Ханте :) А о конкурсной статье, у меня есть свой морфер, чужого не надо. Я думал тут будет что то интересное, с исходниками, с тестами, с аналитикой, а не домыслы, догадки и противоречия, это было бы простительно, но не для конкурса.
 
Я, наверное, слишком въедливый, но всё же...

Бро, это не въедливость, а конструктивная критика. Ты все верно написал, в резултате деления мы получим однозначное число, которое делится на 3 - это 3, 6 или 9. Чтобы исключить шестерку, нужно дополнительно чекать X на четность. Спасибо, что вдумчиво прочитал мою статью!

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

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

Блин, я понимаю что ты тоже участвуешь в конкурсе и очень хочешь победить, но реально почитал твои комменты - ты обсираешь каждую статью. Остановись пожалуйста, это не спортивно, некрасиво и такими действиями ты делаешь хуже только себе.
 
Блин, я понимаю что ты тоже участвуешь в конкурсе и очень хочешь победить, но реально почитал твои комменты - ты обсираешь каждую статью. Остановись пожалуйста, это не спортивно, некрасиво и такими действиями ты делаешь хуже только себе.
Я вам не Бро, братья для меня те с кем я воевал. Если бы Вы были адекватным вы бы поняли, что все коменты обоснованные, и мне многие участники задавали вопросы на которые я ответил и писали объективную критику. И я не обсираю, а пишу критику обоснованную. Обисирать это когда читаешь вашу статью и в уме только одна мысль : что за говно я только что прочитал? Так что не надо грязи и научитесь объективно смотреть на вещи, сделайте выводы, у вас еще есть время сделать хороший пример исходников, а не дрочить мне мозг.
 
Блин, я понимаю что ты тоже участвуешь в конкурсе и очень хочешь победить, но реально почитал твои комменты - ты обсираешь каждую статью. Остановись пожалуйста, это не спортивно, некрасиво и такими действиями ты делаешь хуже только себе.
Он мою не обсирал )
А если по теме, все задумано ради того, чтобы избежать оптимизации кода на этапе компиляции ?
т.е должно получиться что то такое ?
Untitled.png

Так почему бы просто не использоваться volatile и не изобретать велосипед ? Хотя может я и не правильно понял
 
Так почему бы просто не использоваться volatile и не изобретать велосипед ? Хотя может я и не правильно понял

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

Наша задача - замаскировать их. В чем соль маскировки (на пальцах):

1) Сделать так, чтобы компилятор не оптимизировал нашу маскировку.
То есть если вместо 100 написать 50+50 - это не прокатит, в результате оптимизации все равно будет 100.
Ты правильно заметил, мы можем использовать volatile, но тут возникает проблема два.

2) Реализовать маскировку большим количеством способов, желательно бесконечным.
Пример: АВ ругается на 100, мы заменяем на 50+50. АВ заносит в базу 50+50 и ругается уже на это.

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

Вот, это основа для констант. Помимо этого нам еще важно менять поток выполнения нашей программы - это уже сложнее, но я в статье описал метод для автоматизации. Каррируем и движемся по коллбэк-функциям, а дальше логика такая же, как с числами - усложняем изначальную функцию (делаем ее не от 2 аргументов, а от 3) - это порождает дополнительный слой и меняет флоу.

Пример:

Каррируем
f(x1, x2) -> f1(x1, f2(x2))
Это меняет сигнатуру, но сработат один раз (как с числами).

Расширяем кол-во аргументов до случайного:
f(x1..xn) -> f1(x1, f2(x2, f3(x3, ...

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

Вот как-то так)
 
В итоге получается, что детект будет уходить только во время рекомпиляции, при изменении кол-ва аргументов в цепочке функций? Ну или делать изменение в рантайме, но в любом случае появится детект на это. Получается, что использование любого алгоритма, основанного на случайной стартовой величине приводящего к предсказуемой константе, при условии каррирования, позволит убрать детект ?
volatile x;
random(x)
a = x;
x = x*2
x += 12 * y
x \= 2
x -= a
Получаем 6 * y при использовании случайного x, используем пгсч на этапе компиляции, используем макеты и подставляем каррирование под случайное число аргументов. Используем генератор треша и получаем морф движок во время компиляции. Верно ? Особенно интересует вопрос про морф в рантайме. Это все вопросы, а не претензии. Только начинаю изучать морф движки )
 
Может кто не знал, но вашу малварь детектят с помощью YARA правил. Ну и чтобы морфер реально заработал, нужно переписывать все на что может стоять детект, то есть не только на константы.
 
В итоге получается, что детект будет уходить только во время рекомпиляции, при изменении кол-ва аргументов в цепочке функций? Ну или делать изменение в рантайме, но в любом случае появится детект на это. Получается, что использование любого алгоритма, основанного на случайной стартовой величине приводящего к предсказуемой константе, при условии каррирования, позволит убрать детект ?
volatile x;
random(x)
a = x;
x = x*2
x += 12 * y
x \= 2
x -= a
Получаем 6 * y при использовании случайного x, используем пгсч на этапе компиляции, используем макеты и подставляем каррирование под случайное число аргументов. Используем генератор треша и получаем морф движок во время компиляции. Верно ? Особенно интересует вопрос про морф в рантайме. Это все вопросы, а не претензии. Только начинаю изучать морф движки )

Все верно.

Получается примерно так: у тебя есть малварь со следующим алгоритмом.
1) Находит все диски - search()
2) Рекурсивно на каждом диске находит файлы - get_files(disk_list)
3) К каждому файлу применяет функцию шифрования - crypt(files_list)

То есть в очень простом виде твоя программа выглядит так (псевдокод):
Код:
disk_list = search();
files_list = get_files(disk_list);
crypt(files_list);

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

1) Весь поток выполнения программы переписываем ручками в функциональном стиле
Код:
search(get_files(crypt))

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

2) Добавляем трэш функций.
Тут алгоритм может быть индивидуален, но должно получиться что-то типа такого:
Код:
f1(x1, f2(x2, search(x3, f3(x4, get_files(x5, crypt())))))

Обрати внимание, что кол-во аргументов может быть произвольным у каждой функции + мы разрываем цепочку вызовов (наши функции уже не вызываются подряд).

Разница с императивным подходом (когда команды подряд идут) в том, что код функции search ты можешь разбить пополам например, одну часть вычислить на одном уровне, передать как аргумент и вторую часть вычислить где-то на другом уровне.

Еще важный момент - я хоть и пишу f1,f2..., но под этим я подразумеваю анонимные функции, которые не определены где-то заранее.

По поводу твоего кода - да, это будет работать. Если напишешь генератор таких выражений (на сам алгоритм получения 6*у со временем прилетит детект, поэтому от билда к билду он должен меняться) - вот у тебя и получится база для морфа констант.

По поводу рекомпиляции - все верно. Получается раньше ты собирал так:
Сорцы - Компилятор - Бинарник

А с морфером собираешь так (каждый раз):
Сорцы (с пометками для морфера) - Морфер - Новые сорцы (отморфленные) - Компилятор - Бинарник.

То есть морфер - это своего рода препроцессор для твоего кода.

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

В принципе то и все))
 
Ну это все понятно и так было ) Главная проблема именно в рантайме, дабы статик убирать и морфить не проблема ) Ну буду тестировать ) Благодарю )
 
Про пометки - я думаю очевидное решение для боевой ситуации. Ты можешь написать полностью парсер кода на С++ в AST, но это долго и муторно. А можешь просто в сорцах пометки делать, чтобы твой морфер понимал - вот функция, ее морфим так, вот строка, ее морфим так.
Вот с единственным не соглашусь. Никаких пометок. Только ast. Иначе про глубину морфинга можно забыть, как и про правильный, корректный морфинг без багов.
 
Вот с единственным не соглашусь. Никаких пометок. Только ast. Иначе про глубину морфинга можно забыть, как и про правильный, корректный морфинг без багов.

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

Короче, все мы любим стейк рибай, но бывают ситуации, когда приходится есть бигмак)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Так же ставлю плюсик за хорошую статью и считаю ее топовой, идея доходчива, осталось только ее реализовать)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх