最近CoolShell博主做了一个很有意思的在线puzzle,这些谜题很有趣同时也有一定的难度。由于水平有限,我并没有通关,我觉得这些题还是很值得一做的,从中可以学到很多东西。
题目中给出了一个键盘和一行看不懂的字符串。这个键盘的键盘布局和现在通用的键盘(QWERTY键盘)不一样,它叫做Dvorak键盘。这里就不多作解释了,详细的可以去Google。根据提示:我们需要通过两种键盘的布局映射,将给出的字符串转换成QWERTY键盘下的输出。当然,你可以自己一对一写出来,不过在线转换工具更方便。1
macb() ? lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+
转换之后得到:1
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
这是1987年国际C语言混乱代码大赛(The International Obfuscated C Code Contest, IOCCC)一等奖的获奖代码,由贝尔实验室的David Korn提交。当然平时我们不会写出这么复杂难懂的代码,但是分析这样的代码却可以扩展我们的知识。
1 | int main() |
这段代码主要用到了x[a]和指针运算的一些知识,相信上面的步骤和注释已经很清楚了,最终结果就是输出unix
。