当前位置:  开发笔记 > 后端 > 正文

这个使用不可打印的unicode字符的混淆hello world程序如何工作

如何解决《这个使用不可打印的unicode字符的混淆helloworld程序如何工作》经验,为你挑选了1个好方法。

一个漫画将这个hello world程序作为Ruby代码的一个例子.

代码看起来像这样; 但有一些不可打印的unicode字符,我无法进入Stack Overflow代码编辑器.

      = 1
      =  + 
      =   *  + 
      =    *  
      = 
      [      *(   +  )+  , 
             =     *    + , 
             =     *    +    -  , 
            , 
            =        +    ,
        *  +    +  , 
        *    -  *    +   +  , 
           , 
           + +  , 
            , 
        *    ,     + +  , 
        ]
puts      .map(&:chr).join

我想看看它是如何工作的,但是当我最初尝试在几个在线IDE中运行时,它们都报告了语法错误,因为GitHub没有将unicode字符放在Web版本中.任何人试图从这里或GitHub页面复制代码而不是下载zip版本(以获取特殊字符)将有同样的问题.找到了让它运行的问题,它是如何工作的?



1> sawa..:

在压缩文件中,使用类似于下划线的字符.用下划线替换这些字符不会改变程序的行为,所以我将在这里这样做:

_     = 1
__    = _+_
___   = __*__+_
____  = ___*__
_____ = 
      [____  *(___+__)+__, 
    _______  = ____*____+_, 
    ________ = ____*____+____-__, 
    ________, 
    _______ = _______+____,
    ____*__+____+__, 
    ____*____-__*____+___+__, 
    _______, 
    _______+_+__, 
    ________, 
    ____*____, ____+_+__, 
    ____]
puts _____.map(&:chr).join

请注意,一到八个序列(不包括六个)_被用作不同的变量,所以让我们用a,替换它们b,...... h(不包括f)以使它们更容易阅读:

a     = 1
b    = a+a
c   = b*b+a
d  = c*b
e = 
      [d  *(c+b)+b, 
    g  = d*d+a, 
    h = d*d+d-b, 
    h, 
    g = g+d,
    d*b+d+b, 
    d*d-b*d+c+b, 
    g, 
    g+a+b, 
    h, 
    d*d, d+a+b, 
    d]
puts e.map(&:chr).join

通常格式化后,您会得到:

a = 1
b = a + a
c = b * b + a
d = c * b
e = [
  d * (c + b) + b,
  g = d * d + a,
  h = d * d + d - b,
  h,
  g = g + d,
  d * b + d + b,
  d * d - b * d + c + b,
  g,
  g + a + b,
  h,
  d * d,
  d + a + b,
  d
]
puts e.map(&:chr).join

这一切都始于a = 1,并最终定义数组e,这是:

e # => [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 13, 10]

并且它的每个元素都是字符的ASCII码"Hello World\r\n".通过申请chr该号码,您将获得:

["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d", "\r", "\n"]

当你join和他们puts,你得到输出:

Hello World


"类似于下划线的字符"似乎是[`U + 00A0 NO-BREAK SPACE`](http://www.fileformat.info/info/unicode/char/00a0/index.htm)(我想你的编辑正在添加下划线,以便您可以看到字符在那里).奇怪的是,这似乎是局部变量的有效字符 - 事实上,快速测试表明Ruby将接受许多(如果不是全部)unicode空格字符作为有效变量名称.可能是一个Ruby bug?
推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有