【picogym】Transformation WriteUP【picoCTF2021】

問題カテゴリ

  • Reverse Engineerng

問題を理解

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)])

  • encというファイルとコードが与えられている。
  • リバースエンジニアリングというカテゴリ。

脆弱性を見つける

encを調べていく

fileコマンド

enc: Unicode text, UTF-8 text, with no line terminators

  • unicode textらしい。

catコマンド

  • 開いてみると文字化けしている。

灩捯䍔䙻ㄶ形楴獟楮獴㌴摟潦弸弰摤捤㤷慽

実行

./enc: 1: 灩捯䍔䙻ㄶ形楴獟楮獴㌴摟潦弸弰摤捤㤷慽: not found

問題文のコードをを読んでみる

".join(

[chr((ord(flag[i]) << 8) + ord(flag[i + 1]))

for i in range(0, len(flag), 2)]

)

とりあえず、ChatGPTの説明

あなたが提供したコードはPythonで書かれています。以下にその動作を説明します。このコードは文字列flagの各連続した2文字を1つのUnicode文字に変換する操作を行っています。

その手順は以下の通りです。

  1. flagの文字列を2文字ずつ取り出す(range(0, len(flag), 2)により0から文字列の長さまで2ステップずつ進む)。
  2. 各文字をUnicodeの整数値(これをコードポイントと呼びます)に変換します(ord(flag[i])ord(flag[i + 1]))。
  3. 最初の文字のコードポイントを左に8ビットシフトし(つまり、それを256倍し)、2番目の文字のコードポイントと合算します。結果として、新しい整数が得られます。
  4. その整数を新しいUnicode文字に戻します(chr()関数を使用)。
  5. すべての新しいUnicode文字を連結して1つの文字列を生成します(''.join())。

なお、このコードが正しく動作するためには、flagの長さが偶数であることが必要です。奇数の長さの文字列を使うと、最後の文字に対応する文字が存在しないため、エラーが発生します。

この種の操作は一般的にデータのエンコーディングやデコーディングに使われることが多いです。たとえば、特定の情報を2文字の組み合わせでエンコードし、それを後でデコードして情報を取り出す、といった用途に使われます。

その脆弱性で何ができるか考える

与えられたコードでencファイルをデコードすればflagがゲットできそう。
ChatGPTに書いてもらったらできた。

感想

右シフトとか、bit演算とか、基本情報とかの勉強で出てきてよくわからなかったのが、
使ってみると少し意味が理解できた。

コードは、ChatGPTに頼りながら少しずつ理解していく。

CTF

Posted by tyokio