https://github.com/ctfs/write-ups-2015/tree/master/mma-ctf-2015/pwn/d3flate-500解けないからwriteupを見たが、writeupにあった実装ではどれもzlibの計算が停止する気配がなかった。solution全体の流れは単純。baseとcanaryをleak以下を繰り返す平文を送るそのzlib圧縮結果のbofでstackを書き換えるByeと送って発火proof-of-workは単純にやるしかない。運が悪いとけっこうかかる。stackのleakに関して。長さに$-1$を指定すると、標準入力からの読み込みは実際には行われないが$255$文字読まれた扱いになる。ここで、proof-of-workの際の関数によるcanary等が$espより低位側に残されているので、これが読める。proof-of-workが邪魔だからとbinaryを書き換えてnopで埋めていると、canaryが見つからずどうにもならなくなるので注意。stackへの書き込みは、文字列sを送るとzlib.compress(s)が書き込まれる。canaryやreturn先address等が書き変わるが、当然書き込む値は自由にはならない。平文となるsをzlib.compress(s)が要件を満たすまで生成し続ければよい。乱数を突っ込めば圧縮できずにそのまま出てくるが、そのようなものは禁止されているので使えない。/bin/sh)を書き込む必要があり、一括で書き込むのは難しい。$1$byteずつ後ろから書き込むとよい。