解説
壊れて開けない PDF からフラグを回収する問題。とりあえずpdfをダウンロードします。
マジックバイトが抜けている可能性があるので、確認します。
λ xxd blank_paper.pdf | head -n 1 |
予想通りです。あとは PDF のマジックバイトを公式リファレンスで確認して、その値で上書きすれば良さそうですね。
Document Management – Portable Document Format – Part 1: PDF 1.7, First Edition の 7.5.2 File Header
によると
The first line of a PDF file shall be a header consisting of the 5 characters
%PDF-
followed by a version number of the form1.N
, whereN
is a digit between 0 and 7
と記載があるので、最初の5文字は %PDF-
で固定ということがわかりました。それぞれの 16進数の値は以下の通りです。
Ascii | hex |
---|---|
% | 0x25 |
P | 0x50 |
D | 0x44 |
F | 0x46 |
- | 0x2d |
今回は先頭4バイトが抜けているので 2550 4446
とすれば良いことがわかりました。
コンテスト中は vim
で上書きしましたが、勉強のため dd
コマンドで作業してみます。
λ echo -n "%PDF" | dd of=blank_paper.pdf bs=1 conv=notrunc |
dd コマンドのオプション | 意味 |
---|---|
of | 標準出力の代わりにファイルへ書き込む。 |
bs | 1回に読み書きするブロックサイズ(バイト数 |
conv | 指定しないと書き換えたデータがファイルの末尾となり、以降に存在していたデータは削除されてしまう。 |
ちゃんと変更されているかどうか確認してみます。
λ xxd blank_paper.pdf | head -n 1 |
良さそうですね。最後に pdf を開いてフラグゲット。
別解
qpdf
を使えば、何もしなくても正しい PDF に変換することができます。
λ qpdf --qdf blank_paper.pdf out.pdf |
フラグ
actf{knot_very_interesting}