网鼎杯--apl(crypto)

下载题目后发现为一apl文件,简单百度后发现APL文件扩展名可能是指由一个叫猴子的音频无损音频压缩创建的曲目信息文件。尝试打开后无果。
编辑器打开发现有+号等,base64解码得到一段代码如下图
网鼎杯--apl(crypto)
从没见过的东西。一时感到彷徨,再次百度大量查找相关资料。
APL是A Programming Language或Array Processing Language的缩写。肯尼斯·艾佛森1962年设计这个语言时他正在哈佛大学工作。为此他1979年获得图灵奖。在过去数十年的使用历史中,APL从它的原始版本开始不断改变和发展,今天的版本与1963年发表时的版本已经非常不一样了。但它始终是一种解释执行的计算机语言。现代的APL版本都支持其初试版本不支持的结构和模式编程。APL至今依然使用一种非标准化的字母表,这一点一直是他人对它的批评点。
又找到一个在线的apl编辑文档,可以边实验边理解。apl在线编程
apl是一个从右向左执行的语言。
APL的函数使用{}包裹,函数可以有一或两个参数,右边的参数用变量⍵表示,左边用变量⍺表示。
我们先对得到的代码进行处理,让其易读。
网鼎杯--apl(crypto)
由于apl是从右往左执行的,故此推测输入flag返回yes,this is your flag. 我们需要从上面逆推。
先看最上面的函数:
网鼎杯--apl(crypto)
一番尝试发现需要变量为0时输出This is flag
再进行一番测试后搞懂了几个函数,符号的作用:
网鼎杯--apl(crypto)
⎕ucs()是将字符串转换为asc2码。
网鼎杯--apl(crypto)
a ⍴ b 是将b扩充到a长度。
网鼎杯--apl(crypto)
(1+(|¯8)⍴1)计算结果为22222222。
实验可以知道这里是将ascii转成二进制。
网鼎杯--apl(crypto)
一个独立的表达式,其值固定。
网鼎杯--apl(crypto)
观察后发现将其扩充为20行16列的矩阵。
⌽ ⊖分别表示将矩阵的行、列倒序。
10⊖将矩阵的列向上位移10。
7*2表示7的2次方,
⍴’FlsWhat’计算字符的长度。
a⌊b计算a,b最小值,⌊a对a取整。
⍳a返回一个1-a的数组。
+/a表示对a求和.
网鼎杯--apl(crypto)
接着再转回asc2码得到结果。
接下来我们看这个函数:
网鼎杯--apl(crypto)
a←(8⍴2)⊤⍵表示赋值给a
≠指异或
8↑a是保留前8位
因此,这个子函数就是f(x)=x^shift(x), shift函数为x右移一位,在前面补1。
网鼎杯--apl(crypto)
⍺就是函数左边的参数,即密文。与我们加密的结果异或并求和后,如果结果是0,则答案正确。

2⊥(8 40)⍴⌽⊖10⊖(20 16)⍴(8⍴2)⊤(106 202 104 193 192 206 201 100 192 194 204 194 75 200 206 106 193 75 192 201 201 194 75 206 196 98 206 75 196 192 201 108 198 204 100 193 46 40 35 38)

70 76 65 71 56 98 51 54 99 57 48 50 45 55 100 50 55 45 52 57 57 48 45 56 101 55 49 45 52 51 52 48 98 57 55 48 56 97 53 101

将以上ascii转成字符串即为flagFLAG8b36c902-7d27-4990-8e71-4340b9708a5e