混淆难题:你能弄清楚这个 Perl 函数的作用吗?
sub foo {[$#{$_[!$||$|]}*@{$_[!!$_^!$_]}?@{$_[!$..!!$.]}[$_[@--@+]%
@{$_[$==~/(?=)//!$`]}..$#{$_[$??!!$?:!$?]},($)?!$):!!$))..$_[$--$-]%@{
$_[$]/$]]}-(!!$++!$+)]:@{$_[!!$^^^!$^^]}]}
更新:我认为“谜题”这个词暗示着这一点,但是:我知道它的作用 - 我写了它。 如果您对这个谜题不感兴趣,请不要在上面浪费时间。
sub foo {[$#{$_[!$||$|]}*@{$_[!!$_^!$_]}?@{$_[!$..!!$.]}[$_[@--@+]%
@{$_[$==~/(?=)//!]}..$#{$_[$??!!$?:!$?]},($)?!$):!!$))..$_[$--$-]%@{
$_[$]/$]]}-(!!$++!$+)]:@{$_[!!$^^^!$^^]}]}
update: I thought the word "puzzle" would imply this, but: I know what it does - I wrote it. If the puzzle doesn't interest you, please don't waste any time on it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
以下是如何弄清楚如何对该子例程进行反混淆的方法。
抱歉太长了
首先让我们整理一下代码,并添加有用的注释。
现在让我们删除一些混淆。
现在我们已经了解了正在发生的事情,让我们命名变量。
让我们重构代码以使其更具可读性。
Here is how you figure out how to de-obfuscate this subroutine.
Sorry for the length
First let's tidy up the code, and add useful comments.
Now let's remove some of the obfuscation.
Now that we have some idea of what is going on, let's name the variables.
Let's refactor the code to make it a little bit more readable.
在处理我的其他答案时,我发现这个命令很有帮助。
perl -MO=Concise,foo,-terse,-compact obpuz.pl > obpuz.out
B: :简洁
I found this command helpful, when working on my other answer.
perl -MO=Concise,foo,-terse,-compact obpuz.pl > obpuz.out
B::Concise
它接受两个 arrayref 并返回一个新的 arrayref,其中第二个数组的内容经过重新排列,使得第二部分位于第一部分之前,并根据第一个数组的内存位置在某个点进行分割。 当第二个数组为空或包含一项时,仅返回第二个数组的副本。 等价于以下内容:
$list1 % @$list2
本质上是根据$list
选择一个随机位置来分割数组,在计算时该位置计算为 $list 的内存地址在数字上下文中。原文大多使用大量涉及标点变量的同义反复来进行混淆。 例如
@- - @+
始终为 0已更新,请注意
perltidy
在这里的破译非常有帮助,但它被噎住了! !$^^^!$^^
,将其重新格式化为!!$^ ^ ^ !$^ ^
,这是无效的 Perl; 它应该是!!$^^ ^ !$^^
。 这可能是 RWendi 编译错误的原因。It takes two arrayrefs and returns a new arrayref with the contents of the second array rearranged such that the second part comes before the first part, split at a point based on the memory location of the first array. When the second array is empty or contains one item, just returns a copy of the second array. Equivalent to the following:
$list1 % @$list2
essentially picks a random place to split the array, based on$list
which evaluates to the memory address of $list when evaluated in a numeric context.The original mostly uses a lot of tautologies involving punctuation variables to obfuscate. e.g.
!$| | $|
is always 1@- - @+
is always 0Updated to note that
perltidy
was very helpful deciphering here, but it choked on!!$^^^!$^^
, which it reformats to!!$^ ^ ^ !$^ ^
, which is invalid Perl; it should be!!$^^ ^ !$^^
. This might be the cause of RWendi's compile error.