CTFのPwnableの本の改訂版を技術書典9で頒布しています

紙は明日(9月22日23時59分)まで。 電子版は会期終了後も頒布継続できるらしい。

techbookfest.org

紹介やサンプルページなど。

sanya.sweetduet.info

前回の記事。

kusano-k.hatenablog.com

File stream oriented programmingとか、glibc 2.31までの内容とかを追加した。

おかげで、InterKosenCTF 2020のFables of aeSOPは簡単に解けた。

qiita.com

以下、細々とメモ。

別の本にするのか改訂版にするのか

元々は、5月のコミックマーケットC98で別の本を頒布しようと思って、問題を作っていた。 新型コロナウイルスでC98の中止が決定されたので放り投げた。 このまま放置はもったいないので、オンライン開催の技術書典9の話を聞いて、もう1回取りかかった。

1冊にするには分量がちょっと少ない。 Twitterで「同人誌をシリーズにしても、基本的に前の本を買った人しか後の本は買わないから先細りだよ」みたいなツイートを見かける。 「いや、○○2を見かけて、1と一緒に買ったことがあるぞ」とも思ったけど、まあ、そういう人は少なそうというのは分かる。 2だけで完結するなら良いけど、1も必要な本で1だけ完売となるとつらいし、その辺の管理も面倒そうだな……と前の本にこの内容を追加してまとめることにした。

実際、技術系の同人誌は「第○版」みたいなのをときどき見かける。 これをやっている人は旧版の在庫をどうしているんだろうなぁ。 1回のイベントで、最初は旧版を頒布して、途中から新版に切り替えたら文句を言われそう。 私の場合、今は在庫が無いからちょうど良いと思っていたけど、これは勘違いで、在庫が出てきたわ。

glibc 2.27とglibc 2.31の共存

2020年4月23日Ubuntu 20リリース。

CTFの問題サーバーはUbuntuのLTSで動いていることが多いと思う。 この本で扱っている問題もUbuntuUbuntuのバージョンによってglibcのバージョンも異なり、問題の解き方も変わる。 Ubuntu 18はglibc 2.27、Ubuntu 20はglibc 2.31。

github.com

予定通り5月に出していたなら、Ubuntu 18でも良かったかもしれないが、20リリース半年後に古いバージョンで出したくはない。 「ま、攻撃コードをちょっと修正すればUbuntu 20で動くだろ」と思ったら甘かった。 (私では)どうやっても解けなくなる問題があったり、問題で解説したいところ以外が面倒になったりする。

qiita.com

glibc 2.31の解説もするならば、同じプログラムをglibc 2.27とglibc 2.31でそれぞれ解くのも面白そうな気がしてきた。 ということで、glibc 2.27とglibc 2.31の両方の環境を用意する必要がある。 しかし、問題サーバーを2個動かすのは面倒。 1個のサーバーでプログラムごとにglibc 2.27とglibc 2.31を指定したい。

Dockerで動かしている問題サーバーの中で、さらにDockerを動かす(Docker in Docker)ことも考えたけれど、何かと面倒らしい。

システムのlibcとは別のlibcを置いたディレクトリを環境変数LD_LIBRARY_PATHに指定すれば、別のlibcを読み込ませることができる。 でも、ldとバージョンがあっていないと起動中に落ちる。 そしてldのパスはプログラムに絶対パスで埋め込まれているので、LD_LIBRARY_PATHが効かない。 ldのパスを書き換えれば良くて、patchelfというコマンドでそれができる。 ついでにライブラリを読み込むディレクトリも指定できるので、LD_LIBRARY_PATHも不要になる。

patchelf --set-rpath /lib227/ --set-interpreter /lib227/ld-2.27.so program

CTFの出題者、libcを配布するついでにldも配布してくれないかな。 そうしたら問題サーバーと同じ環境で問題のプログラムを動かせる。

印刷所

これまで同人誌の印刷はポプルスに頼んでいた。

技術書典曰く、オペレーションの都合上、搬入は1サークル1箱でQRコードを貼り付けろと。ポプルスに「1箱に詰めて、QRコードを貼り付けてくれ🙏」と頼んでやってくれるか分からないし面倒、一度自宅を経由するにしても、そんなでかい段ボール箱どうするんだ……。ということで、別の印刷所も使ってみるかと、提携印刷所の日光企画に頼むことにした。なお、この条件は「自宅から」送付する場合だけの話で、提携以外の印刷所でもこの辺の作業は不要だった。

ページ数が増えたことによって印刷代がシビアになってくる。日光企画の料金表を見てみると、高ぇ……。同人誌の原価の話がたびたび炎上するけど、利益0か赤字では……と思っていたら、これはベースの価格で、早めに入稿するだけで20~40%割引になる。pixivプレミアム会員なら5%割引。プレミアム会員でなくても申込み直前に会員になればOK。プレミアム会員費540円は誤差。さらに、指定の見積もりサービスで見積もりして、クレジットカード払いではなく銀行振り込みすればさらに5%割引(この5%は、元の値段ではなく、早期入稿などの割引を適用した後の価格がベース)。ということで、最終的な値段はあまり変わらない。

あと、冊数のに対しての印刷代の上がり方も印刷所によって全然違う。オンデマンドとオフセットでどちらが安くなるかとかも違ってきそう。「どこもたいして変わらないだろ」と思っていたけど、安く高品質で印刷したかったら色々と調べないとダメだな。

AMスクリーニングとFMスクリーニング

ということで、ほぼ同じ表紙を異なる印刷所に頼んだので、比較ができる。 1枚目がポプルス、2枚目が日光企画。 どちらもオンデマンドで、「高精細表紙」みたいなオプションは無し。 カメラのホワイトバランスは同じなので実際の色合いの違いもこんな感じ(再販などで違う印刷所のものと色合いを揃えたければ、前の本も送れば何とかしてくれるらしい)。

細かい粗い以前に、網点が規則的かランダムで見た目が全然違うような……。 これがAMスクリーニングとFMスクリーニングか。 こういうことをブツクサ言っていると、紙の本を買ってくれる人がいなくなりそうだけど、まあよっぽど目を近づけて見なければ分からん。

ポプルスがFMスクリーニング、日光企画がAMスクリーニング(オンデマンド印刷でもこの用語を使うのかは知らないけど)。 以前の技術書典で買った「ねこのしっぽの4色フルカラーオフセット印刷スクリーン線数比較本」に載っていた。

www.shippo.co.jp

この本、AMスクリーニング15線~800線、FMスクリーニング70μ~20μで実際に印刷されていて面白い。 これは印刷所にしか作れない本(少なくとも、ねこのしっぽは線数の指定は受け付けていないらしいので)。

AMスクリーニングとは、点の位置を固定して点のサイズで濃さを変える方式。 線数が1インチに並ぶ点の個数。 「細かければ細かいほど良いんでしょ。800線で印刷してくれ」と素人は思うけれど、線数が高くなると多階調がなめらかに表現できなくなるらしい。 800線を見ても違いが分からないが……。 たぶん、点が細かいとサイズのコントロールが難しいのでしょう。

FMスクリーニングは点をランダムに配置し、点の個数で濃さを変える方式。 FMスクリーニングのほうが良さそうだが……この本曰く、

FMスクリーニングに関しては同人誌印刷業界では採用している会社が多いのですが印刷業界的には主流ではなく、過去の流行のような扱いになっていまして、製版機メーカーでも開発を止めてしまっているが現状です。

だそうで。 FMスクリーニングには、濃いところが潰れやすくなったり、淡いところで点の間隔が広がってしまうデメリットがあるらしい。 AM印刷の技術向上で、線数を上げられるようになったから、もうFMスクリーニングは要らないということなのだろうか。