はじめに
picoCTF Transformation 解いたのでwriteupかく
自力でやりたい方はここでページを閉じてください
問題
I wonder what this really is... enc
というコメントとともに以下のコードが書かれている
''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])
で、添付ファイルをダウンロードすると以下の変な文字がでてくる
灩捯䍔䙻ㄶ形楴獟楮獴㌴摟潦弸彥㜰㍢㐸㙽
解説
つまりよくわからんエンコーディングで加工されたflagをとりだせばよろしい
これ何の言語かよくわからんがchr()とord()はよくある関数で、unicodeポイントを文字にしたり、逆にユニコードポイントとってきたりするやつなので一旦無視すると
- flagを2文字ずつループまわす
- 生成する文字の上位8bitに1文字めを突っ込む
- 下位8bitに2文字目を突っ込む
してるよう。ほえーなるほど。ASCII以外の文字列だと1byteに収まらないけど、今回取得したいflagはASCIIなことが事前にわかっているしまあ問題ないのか
で、ヒントみると 調べてみるとonlineデコーダ見つかるかもよ!
みたいにいってるけどこのくらいなら手で書いたほうが早い
package main func main() { str := "灩捯䍔䙻ㄶ形楴獟楮獴㌴摟潦弸彥㜰㍢㐸㙽" rs := []rune(str) for _, v := range rs { print(string(v >> 8)) print(string(v & 0b11111111)) } } // Output: // picoCTF{16_bits_inst34d_of_8_e703b486}
https://go.dev/play/p/JiJ3nX-clew
終了!