ちりもつもればミルキーウェイ

好奇心に可処分時間が奪われる

picoCTF Transformation writeup

はじめに

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

終了!