【Rev・バイナリ解析関係】PDFをいじめる【バイナリ解析】

 

前置き

先日、twitterでこんなことを言った。

 しかし、まだテスト期間は終わってないので、しばらくは何書こうが私の勝手なのである(試験勉強しろ)

 

まぁ、試験は今期3つしかないのでどうにかなるだろう。そして、この記事を書いてる時点で2つ終了して、次の試験まで割と時間があるのでこの記事を書いている。内容はタイトルの通りである。講義中にPDFの誤りを見つけた教授が「PDFで修正できないため...(ry」と仰っていたが、同じ席に座っていたバイナリアン二人はこう思った「エディタでいじれば修正できるんじゃないか?」

ということで講義が終わり、さっそくエディタでPDFにあんなことやこんなことをしてしまう訳である。具体的には、数か所値を書き換えてみて、どこを書き換えたらPDFの本分に影響を及ぼすのか調べていこうという物である。ちなみに、元のPDFの一部を抜粋すると以下のようになっている。

f:id:yamanobori_programing:20190605180744p:plain

最初、問題文が書かれていて、その下に考察(貧弱)、問題解決に用いたソースが記述されている。今回はこのPDFに対し、以下の3か所を書き換えた。

f:id:yamanobori_programing:20190605175918p:plain

f:id:yamanobori_programing:20190605175955p:plain

f:id:yamanobori_programing:20190605180011p:plain

書き換える量は、残念ながら適当である。1か所書き換えたら、その都度PDFを開き、どこが変化したか観察する。1回目と2回目の書き換えの結果、本文の内容に変化はなかった。しかし、PDFを開いている間、evinceはこんなエラーを吐き続けていた。

f:id:yamanobori_programing:20190605180927p:plain

どうも、書き換えの過程で、PDF内でフォントを定義している部分を(そんなところがあったならば)侵食してしまったようだ。ただし、この時点で最初の書き換えと2回目の書き換えのどちらがフォント定義の領域を侵食したのかは分からない。3回目の書き換えで、ようやく本分の書き換えに成功した。

f:id:yamanobori_programing:20190605181346p:plain

ソースコードの部分とかがごっそり抜け落ちている。

PDFの構造のお話

PDFは、大雑把に言うと以下の構造になっている。

  • ヘッダー
  • ボディー
  • クロスリファレンステーブル
  • トレイラー

大雑把に説明すると、ヘッダーはそのファイルがどんなファイル化を識別するためのデータ部分。 ELFなら、ELFを表すデータが格納されているし、ZIPファイルならZIPファイルを表すデータが格納されている。ボディーは文章の内容を表しているようである。インダイレクトオブジェクトと呼ばれるもので構成されていて、インダイレクトオブジェクトにはどんな文章を、どんな大きさで、どんなフォントで表現するかなどが表されている。クロスリファレンステーブルは、インダイレクトオブジェクトがどのオフセットに格納されているかを表している。トレイラーはPDFの最後の部分に現れ、「trailer」、「startxref」、「%%EOF」の順に出現する。(セキュリティキャンプの課題提出までに、このことを知ってたらもっといいとこまで行けたかもしれないと思うと非常に悔しくなる...)。インダイレクトオブジェクトについて、もう少し詳しく見てみると、自分のPDFで、あるインダイレクトオブジェクトは以下のような記述になっている。

14 0 obj 

<</Filter\FlateDecode/Length 1332>>

stream

hogehogehugahuga

endstream

endobj

実際、今回の書き換えでは3つとも全てインダイレクトオブジェクトのstream~endstream間の値を書き換えていたが、なぜか3つ目の書き換えを行ったときのみ本分に影響が出た。インダイレクトオブジェクトはランダムに配置されているようで、本分とインダイレクトオブジェクトの対応が分かれば、PDFの書き換えが出来そうだが、その話はまたいつか。

 

参考にさせていただいたページ

www.pdf-tools.trustss.co.jp