33C3CTF WriteUp pay2win [200] web

cheapとflagが買えるようです。
まずはcheapから買ってみることにしましょう。
f:id:megumish:20170103235550p:plain
クレジットカードナンバーはcredit card number sample などで検索して出てきたものを入力してもいいですが、
実はLuhnアルゴリズムが通る数字ならなんでもいいっぽいので0でも入力しておきます。
f:id:megumish:20170103235637p:plain
0を入力すると無事にcheapを購入することができ、cheap.txtの中身を見ることができます。
f:id:megumish:20170103235659p:plain
次にflagを購入してみましょう。
flagもcheapを買ったときと同じように、0を入力し購入できるか試します。
おっと、クレジットカードの使用限度を超えていて買えないようです。
f:id:megumish:20170103235718p:plain

おおよそflagを手に入れる方法は次の二つです。
正しいクレジットカードナンバーを入力するか、cheapの購入後画面でをcheap.txtをflag.txtを何らかの方法で書きかえることで手に入れるかです。
答えを先に行ってしまうと正しかった方は、cheap.txtをflag.txtに書きかえる方です。

以下flagを発見した手順です。
まず、cheapを購入する場面でのURLのdataの値と、flagを購入する場面でのURLのdataの値を比較します。

cheap:5e4ec20070a567e03c598eac510b4a85475daa246cb031e03b5b0554edda4f8828df361f896eb3c3706cda0474915040
flag :5e4ec20070a567e03c598eac510b4a85d1d71c0ceb6e8d6d4f75c9736d3b8e0641e7995bb92506da1ac7f8da5a628e19ae39825a916d8a2f

ここでまず、二つのdataの長さが違うことに気付きます。自分はflagのdataの末尾にあるae39825a916d8a2fという文字列をcheapのdataの後ろに引っ付けて試してみることにしました。
すると次のような画面が現れました。
f:id:megumish:20170103235750p:plain
なんとcheapがcheapgになっています。これによりae39825a916d8a2fがflagの末尾であるg部分に対応すると推測できます。*1
しかし、flagやcheapの文字ひとつひとつがハッシュ化されて末尾に固められているという確証はまだできません。
もしかしたらハッシュ値全体にちりばめられている可能性もあるからです。
次に、cheapを購入する前と購入後のdataの値について比べてみます。

cheap購入前:5e4ec20070a567e03c598eac510b4a85475daa246cb031e03b5b0554edda4f8828df361f896eb3c3706cda0474915040
cheap購入後:5765679f0870f4309b1a3c83588024d7c146a4104cf9d2c88d527869fa7bdbef28df361f896eb3c3706cda0474915040

後ろの32文字に注目すると、28df361f896eb3c3706cda0474915040という同じ文字列で構成されていることがわかります。
二つのページで共通する文字列はcheapだけであるため後ろ32文字がcheapを表しているということがおおよそ確定できます。

つまりcheap購入後の後ろ32文字と同じ位置にあるflagの後ろ48文字を交換すれば見事flagがとれるのではないでしょうか、早速試してみます。
はい、とれました。おわり。
f:id:megumish:20170103235815p:plain
フラッグ

33C3_3c81d6357a9099a7c091d6c7d71343075e7f8a46d55c593f0ade8f51ac8ae1a8

*1:まだサーバーが動いてるなら試すことができるが、ae39825a916d8a2fをさらに付け加えると、どんどんgを増やすことができる。