天天看點

網鼎杯--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

繼續閱讀