【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文字に変換する操作を行っています。その手順は以下の通りです。
flagの文字列を2文字ずつ取り出す(range(0, len(flag), 2)により0から文字列の長さまで2ステップずつ進む)。- 各文字をUnicodeの整数値(これをコードポイントと呼びます)に変換します(
ord(flag[i])とord(flag[i + 1]))。- 最初の文字のコードポイントを左に8ビットシフトし(つまり、それを256倍し)、2番目の文字のコードポイントと合算します。結果として、新しい整数が得られます。
- その整数を新しいUnicode文字に戻します(
chr()関数を使用)。- すべての新しいUnicode文字を連結して1つの文字列を生成します(
''.join())。なお、このコードが正しく動作するためには、
flagの長さが偶数であることが必要です。奇数の長さの文字列を使うと、最後の文字に対応する文字が存在しないため、エラーが発生します。この種の操作は一般的にデータのエンコーディングやデコーディングに使われることが多いです。たとえば、特定の情報を2文字の組み合わせでエンコードし、それを後でデコードして情報を取り出す、といった用途に使われます。
その脆弱性で何ができるか考える
与えられたコードでencファイルをデコードすればflagがゲットできそう。
ChatGPTに書いてもらったらできた。
感想
右シフトとか、bit演算とか、基本情報とかの勉強で出てきてよくわからなかったのが、
使ってみると少し意味が理解できた。
コードは、ChatGPTに頼りながら少しずつ理解していく。


ディスカッション
コメント一覧
まだ、コメントがありません