選択肢2にFSBがある。
しかし、-D_FORTIFY_SOURCE=2を指定されているためleakしかできない。
まずスタックにある__libc_start_main+234
を読んでlibc leakをする。
他に道がないため、randで使われるseedをleakすることを考える。
https://code.woboq.org/userspace/glibc/stdlib/random.c.html#__random
を見ると、randtblという配列に乱数を生成するための情報が格納されるようだ。
それをgdbなどでオフセットを確認した後leakする。 (失敗してnullが入ることがあるので、その場合やり直す)
その後、乱数生成のアルゴリズムを作って過去8回のdice()の結果が1になるように調整できる練習の回数を求めればよい。
-
やってることはFSBでleakするのみだが、randの実装を読む必要があるのでMediumにした。
(初心者向けCTFということを考えればHard寄り?)
-
選択肢2で最大値を10**7にしているのは計算リソースの制限。
6**8 = 1679616 なので運が悪くても10**7の制限に引っ掛かるのは2-3回くらいだろう。
-
ld-linux-x86-64.so.2は配布しなくてもいいかも?
動かない場合がありそうなので念のため配布するようにしたが、通常のpwnでは配布されないので混乱させてしまうかも。