Search
Write a publication
Pull to refresh

Malbolge algorithm

Доброе время суток, Хабраобщество.

Сегодня я попробую вам рассказать как написать программу на Malbolge.

Ровно две недели назад я узнал о языке Malbolge из сериала «Элементарно». Как раз в этот период мне в Университете поручили написать статью и провести исследование на выбранную мной тему, не задумываясь я выбрал Malbolge (о чем скоро пожалел). Забравшись в интернет я нашел не так много информации, точнее я нашел только описание специфики и историю. Мне пришлось разбираться со всем самому. При многочисленных попытках я нашел довольно много нюансов которыми я хочу поделиться с вами, также я представлю свой код программы.

Информацию и специфику языка вы может найти перейдя по ссылке вики.

Вики дает две программы, которые печатают «Hello, world.»:

(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<

Второй вариант:

('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj«Fhg${z@>

Если попытаться заменить любой символ в программе она перестает работать. Прична скрывается в шифровании, то есть любой символ входящий в программу шифруется с помощью формулы (m [c] + c-33)% 94, эту формулу нам предоставляет вики. Когда прогрма загружается в память, она просматривает каждый символ и если хотя бы один из них не является командой файл отключается. Для примера возьмем фрагмент из первого варианта программы:

(= <`: 9876Z4321UT.-Q + *)

Этот фрагмент равен:

jpp <ppppp <pppp << pp <ppp

Теперь подробнее. На входе в программу строка делится на символы каждый из них соответствует номеру в таблице ASCII, и именно этот номер играет решающую роль в шифровании данных, например: (= 40 (по коду ASCII), так что в формулу передается число 40 (напомню, нумерация всех символ начинается с 0): (40 + 0-33)% 94 = 0,07, остаток от деления используется как индекс в следующей строке:

+ b (29e * j1VMEKLyC}) 8 & m # ~ W> qxdRp0wkrUo [D7, XTcA \ „lI.v% {gJh4G \\ — = O @ 5`_3i <? Z '; FNQuY] szf $! BS / | t: Pn6 ^ Ha

Под индексом 7 находится символ j. Операция шифрования проводится до окончания входного рядка.Дали согласно зашифрованного файла выполняется команда.

Отступление. Не все это вы прочтете в этой статье будет отвечать вики, так как я пишу с своих наблюдений и опыта.

Итак, вернемся к выполнению программы. Если таким методом зашифровать всю строку мы получим следующее:


jpp<ppppp<pppp<<pp<ppp<pppp<ppppp<pp<ioooj/ojji</oiivoooi<ojvpoj/pvojj<j/o*jov/<ojjj*o/jj/oo/oooooopp<pppp<pppp<pp<v

И так мы имеем 2 строки, с которыми в дальнейшем мы будем работать:
Входная программа:

(=<`:9876Z4321UT.-Q+*)M'&%$H“!~}|Bzy?=|{z]KwZY44Eq0/{mlk**hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<

И зашифрована программа:

jpp<ppppp<pppp<<pp<ppp<pppp<ppppp<pp<ioooj/ojji</oiivoooi<ojvpoj/pvojj<j/o*jov/<ojjj*o/jj/oo/oooooopp<pppp<pppp<pp<v

Выполняем программу:
Первым входным зашифрованным символом является j, соответствующую команде jmp [d + 1], вики говорит что jmp [d] — это не правда, так мы добираемся символа ] входной строки, так как (= 40, а 40 + 1 = 41, 41 символом входной строки является ]. Далее переходим к следующей команды:p — команда операции crz (a, d), в реестре a ничего не находится, т.е. а = 0, реестра d соответствует символ ] = 93, выполняем операцию и получаем Т = 84, значения Т записывается в реестр а = 93. Выполняем следующую команду p: a = crz (a, d) = crz (T, K) = crz (93,75) = H = 72. Таким образом мы получаем первую букву слова „Hello ». Выполняем следующую команду <: эта команда просто печатает символ содержащийся в реестре а есть Н.

По такому принципу работает Malbolge.
Обещанная мной выше программа:

(= <;: ^! 7 [54321654-Q + * N; -, + *) 5 '&% $ # “, -} | {z] rwIoGVlDTBhPlk * <LKf
 
Печатает „MegU“ — Международный экономико-гуманитарный университет имени академика Степана Демьянчука. Украина, Ровно.

Если возникнут вопросы прошу мне сообщить.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.