К эзотерическим языкам примыкают некоторые образовательные языки (educational programming language). Так Н. Вирт в книге Алгоритмы + структуры данных = программы. М.: Мир, 1985 предложил минимизированный язык PL/0 для иллюстрации принципов построения трансляторов. Не смотря на то, что его описание на EBNF очень компактное, этот язык выглядит «объемнее», чем большинство эзотерических языков. Однако ассемблер процессора PL/0 (гипотетическая машина) содержит всего семь инструкций, и ИМХО может рассматриваться как эзотерический язык программирования.
An esoteric programming language (sometimes shortened to esolang) is a programming language designed to test the boundaries of computer programming language design, as a proof of concept, as software art, as a hacking interface to another language (particularly functional programming or procedural programming languages), or as a joke. The use of esoteric distinguishes these languages from programming languages that working developers use to write software. Usually, an esolang's creators do not intend the language to be used for mainstream programming, although some esoteric features, such as visuospatial syntax,[1] have inspired practical applications in the arts. Such languages are often popular among hackers and hobbyists.
The cultural context of esolangs has been studied by people like Geoff Cox, who writes that esolangs «shift attention from command and control toward cultural expression and refusal»,[16] seeing esolangs as similar to code art and code poetry, such as Mez Breeze's mezangelle. Daniel Temkin describes brainfuck as «refusing to ease the boundary between human expression and assembly code and thereby taking us on a ludicrous journey of logic,»[17] exposing the inherent conflict between human thinking and computer logic. He connects programming within an esolang to performing an event score such as those of the Fluxus movement, where playing out the rules of the logic in code makes the point of view of the language clear.[18]
Brainfuck подходит для экспериментов по генетическому программированию из-за простоты синтаксиса, и, соответственно, генерации исходного кода.
Thue — Эзотерический язык программирования, разработаный Джоном Колагойя в начале 2000 года. Это мета-язык, который демонстрирует нулевой тип в Иерархии Хомского, то есть неограниченную грамматику.
Будучи эзотерическим языком программирования, Unlambda предназначена для демонстрации очень чистого функционального языка, а не для практического использования.
Языки для других целей, но часто приводимые в списках эзотерических
P′′
QuakeC
P′′ is a primitive computer programming language created by Corrado Böhm[1][2] in 1964 to describe a family of Turing machines.
QuakeC — интерпретируемый язык программирования, разработанный в 1996 году Джоном Кармаком для написания части компьютерной игры Quake.
Можно добавить язык «Эллочка», описанный в статье М. Трофимов. Язык программирования «Эллочка» // Монитор # 7-8,1994, с. 56. В этом языке, названном в честь известной героини Ильфа и Петрова, автор предложил минимизацию избыточности языков, сведя все операторы к виду:
Для Булевых выражений предложено использовать только and и not. Для I/O есть специальная переменная con. Так:
218 true con 'hello' 219
эквивалентно:
write ('hello')
И
219 true x con 220
эквивалентно:
read (x)
Далее автор отмечает:
В итоге получим сверхэкономный язык, основанный на сверхлаконичном словаре — этакий словарь людоедки Эллочки для программистов. Вся беда только в том, что, как известно, скупой платит дважды [...] — многие программы на таком неумеренно лаконичном языке окажутся многословнее своих неэкономных собратьев. И действительно, Turbo Pascal фрагмент:
while (a<>0) or (b<>0) do
begin
dec (a); dec (b);
end;
будет содержать гораздо меньше слов (символов языка), чем аналогичный на языке «Эллочка»
1 not (not (a=0) and not (b=0)) a a 4
2 true a a-1 3
3 true b b-1 1
4
Ok. Спасибо. Убедился, что ничего сверх того, что описано в вики и приводимых там источниках. Там же много методов борьбы. Конечно, бороться с не самыми бестолковыми специалистами не просто, но ИМХО имея исходный код это делать гораздо проще, чем не имея его. Но прежде, чем бороться, часто есть выбор языка исходного кода — ведь как говорят «ничто не ново под луной», и, как правило, программный продукт не уникален, почти всегда можно найти продукты с похожим функционалом, написанные на разных языках. При прочих равных я предпочитаю менее гибкие, но более защищенные языки типа ОО Паскаля. Это ИМХО, которое ни в коей мере не навязываю, чтобы избежать традиционного холивара «какой язык лучше» :)
Исходя из общих соображений думаю, что придумать труднообнаружимый баг очень не просто. Слепой случай может выдать такой баг, который и сотня лучших мудрецов хакеров за сотню лет не выдумает.
Если вы имеете в виду большой самостоятельный кусок кода, который делает что-то нехорошее, то конечно, это дело рискованное. Тем более я не говорю про встроенный кейлоггер, который собирает информацию да ещё куда-то потом отправляет.
Ok — речь про небольшой кусок кода.
Но вставить где-нибудь в коде «сознательную ошибку», которая позволяет сделать эксплойт, например, повышаюший привилегии, вполне реально, согласитесь?
Согласен, что в общей теории звучит убедительно. Но при этом затрудняюсь представить конкретный пример такой ошибки, может потому, что никогда не пытался сделать сознательную ошибку для эксплойта. Можете привести такой пример? Ведь это, как сказали выше, всего «небольшой кусок кода».
Вполне возможно, что в программе дыры и баги, но кейлоггер, нпр., кажется слишком большой наглостью в исходном коде. М.б. я ошибаюсь и такие случаи известны?
Это ещё при условии, что опции компиляции были одинаковые.
Файл проекта известных мне компиляторов задает опции. Но очень вероятно, что не «одинаковая версия компилятора с точностью до билда». Кто-то выложит исх. код с трояном в надежде, что у всех не та версия? — Очень сомневаюсь.
Набившая уже оскомину 0-day уязвимость в OpenSSL существовала много-много лет.
Тут, похоже, особый случай. Это баг или умысел?
Но основная их масса — как раз те самые «серые» куски, куда внимательно не заглядывает никто.
И там (в этих кусках) кто-то рискнет разместить троян, и никто не обнаружит?
Я заглядываю. Кроме вредных действий, мне бывает интересно, как это сделано, можно ли улучшить, интегрировать, использовать какие-то фрагменты в своих разработках и т.д.
Да — забыл сказать: исследовав src1 смогу в случае обнаружения вредных действий не только поймать за руку автора трояна, но очистить код от этих действий и иметь нужную мне работающую программу (была бы не нужна — не заинтересовался бы этим кодом). + Если не ошибаюсь, лицензии open source позволяют выложить исправленный код, т.о. сделаю доброе дело для остальных пользователей, а кто-то так же м.б. сделает доброе дело для меня с другим кодом :)
М.б. не понял Вашей идеи, но ИМХО пусть выложен исполняемый код (exe1) и исходный код (src1). Компилирую src1. Это быстро. М.б. 3 случая: 1) полученный exe2 побайтно равен exe1; 2) полученный exe2 побайтно не равен exe1; 3) не компилируется. В случаях 2) и 3) сразу имеем обоснованные претензии. В случае 1 ищем в исходном коде вредные действия. Это чуть дольше, чем просто откомпилировать и сравнить, но сильно быстрее, чем исследовать исполняемый код. Повторюсь: ИМХО автору трояна нужно считать всех за полных идиотов, чтобы пойти на случай 1. Никаких десятилетий — несколько дней достаточно.
В плане безопасности интересным решением стали защищенные виртуальные машины
В сетке можно найти мнения, что всякая VM защищает от вирусов и троянов, и мнения, что не защищает, что большинству вирусов крайне просто заразить хост. В этой ОС такие особые ВМ, которые защищают, или у всех ВМ защитное свойство?
А что мешает Вам сейчас приступить к самообразованию? У Вас хорошая ЗП и есть свободное время — вместо того, чтобы вечерами смотреть TV или писать в соц.сети читайте книги и учитесь кодить. Даже часа ежедневно м.б. достаточно, чтобы за год чему-то научиться. Сделайте это своим хобби. Делайте упражнения — от простого к сложному — книг, сайтов и форумов для этого полно. Всегда можно спросить совета. Когда будет получаться, можно попробовать себя в конкурсах, а потом попытаться сдать экзамен. Было бы желание.
Вы правы. Но доступный исходный код — это самая сильная гарантия, что в исполняемом файле нет закладок, т.е. что не троян. Обычный пользователь не сможет разобраться в исходном коде, но он знает, что если код попадет под подозрение, кто-то сможет разобраться, и разработчик это знает и вряд ли будет сопровождать трояна исходным кодом.
Где гарантии, что другие документы не подделал? И что фальшивой монетой за хлеб в булочной не платит? :) Нужно быть очень глупым, чтобы такие справки для такой ерунды, как отгул подделывать. Примерно так же, как украсть в магазине булку хлеба и банку колы. И за то и за другое можно получить немалый реальный срок.
Особое восхищение минусатору: это надо придумать минус за вопрос поставить. Уважаемый минусатор, скажите кто Вы — я Вам плюс за такую диалектическую логику поставлю.
А можно полюбопытствовать: это хобби, работа, учебное задание? И какие цели?
Но вот здесь разрешите поспорить с великим автором:
См. Лакатос И. Доказательства и опровержения. Как доказываются теоремы. Пер. И. Н. Веселовского.— М.: Наука, 1967.
<метка><условие><переменная><выражение><метка перехода>
Так,
110 x<y a 10*c 112
будет эквивалентно паскалевскому:
Для Булевых выражений предложено использовать только and и not. Для I/O есть специальная переменная con. Так:
218 true con 'hello' 219
эквивалентно:
И
219 true x con 220
эквивалентно:
Далее автор отмечает:
мудрецовхакеров за сотню лет не выдумает.Ok — речь про небольшой кусок кода.
Согласен, что в общей теории звучит убедительно. Но при этом затрудняюсь представить конкретный пример такой ошибки, может потому, что никогда не пытался сделать сознательную ошибку для эксплойта. Можете привести такой пример? Ведь это, как сказали выше, всего «небольшой кусок кода».
Файл проекта известных мне компиляторов задает опции. Но очень вероятно, что не «одинаковая версия компилятора с точностью до билда». Кто-то выложит исх. код с трояном в надежде, что у всех не та версия? — Очень сомневаюсь.
Тут, похоже, особый случай. Это баг или умысел?
И там (в этих кусках) кто-то рискнет разместить троян, и никто не обнаружит?
Особое восхищение минусатору: это надо придумать минус за вопрос поставить. Уважаемый минусатор, скажите кто Вы — я Вам плюс за такую диалектическую логику поставлю.