网鼎杯Crypto APL WriteUp

writUp没有写完,浅尝辄止,懂了一点点,感觉也写不下去了

01 Base64解码

看到这样一串大小写字母跟数字混杂在一起的乱码,首先想到的肯定是Base64解码

1-1 比赛时解码

在比赛时,解码出来是一堆更乱的字符串,不过英文显示是正确的


luanma


到这一步,跟搜索出来的APL语言更是毫无联系,于是这个题目就死在了这一步


1-2 正确的情况

后来在找到一个在线解码的网站,终于是跟某WriteUp显示的编码是一样的了,也跟APL语言中奇奇怪怪的符号联系起来了。


true


小白推测,之前解码出来仍是乱码的原因是APL语言的符号是非标准编码,然后大部分解码都是转成utf-8,所以会出现乱码。

02 APL

  • 函数定义用txt{···}txt来界定
  • 代码从右往左执行
  • 函数的参数可以有一个或两个
  • 形参⍵表示右边的实参
  • 形参⍺表示左边的实参

函数可以表示为txt {···} txt


func


2-1 代码结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{⍵(~⍵)/('No_Please_continue')('Yes,This_is_flag')}

(∊(41(41)0+140)(⎕UCS('µě»ÕĀ$#Ğ$èáËĞĞĝ`âÞĠ#"!Ġ"KE(©$#Ğ$Q<k'))146)
{
+/⍺≠33+2⊥(1(5)×8)

∊{a≠8↑(1,a←(8⍴2)⊤⍵)}
¨
2⊥8(+/⍴⍳(7*2)-⌊9.1⌊⍴'FlagIsWhat')

10⊖⊖⌽
(∊4(⍴⍴88888)+16)

(1+(|¯8)⍴1)

⎕UCS(⍵)
}
'YourFlagIsWhat?'

2-2 各个函数含义

{⍵(~⍵)/(‘No_Please_continue’)(‘Yes,This_is_flag’)}

查阅文档,’~’的含义是’非’


~


参数跟在{}后(根据之前的{} txt定义)


~


根据运行情况我们可以知道,之后的一大串代码的运算结果需要是’0’

(···){···}’YourFlagIsWhat?’

⍺ : (∊(41(41)0+140)(⎕UCS(‘xxx’))146)
⍵ : ‘YourFlagIsWhat?’
这段代码较长,我们逐一来看

1
(∊(41(41)0+140)(⎕UCS('µě»ÕĀ$#Ğ$èáËĞĞĝ`âÞĠ#"!Ġ"KE(©$#Ğ$Q<k'))146)
  • ∊:文档的解释是enlist
  • ∊(41(41)0+140)串成一个链表即{181,181,140}
  • ⎕UCS():Unicode Convert(就是将那一堆乱七八糟的东西转化成Unicode)
    运行结果:
1
2
3
(∊(41(41)0+140)(⎕UCS('µě»ÕĀ$#Ğ$èáËĞĞĝ`âÞĠ#"!Ġ"KE(©$#Ğ$Q<k'))146)

181 181 140 181 283 187 213 256 36 35 286 36 232 225 203 286 286 285 96 226 222 288 157 35 34 33 288 34 75 69 40 169 36 35 286 36 81 60 107 146

2-3 逆向

dark
sans