Index

6/7 C++ flag checker

ELFはstripされておらず、main は入力長62を確認したあと encode(input) と静的な encoded 配列を比較している。std::iota で10から始まる添字列を作り、それを std::transform で各文字に混ぜる処理だった。

逆アセンブルすると各バイトはおおむね ((ch ^ 0x55) + (10+i)^3) mod 256 の形。.rodata から62バイトの比較対象を抜き、各位置で加算分を引いてから 0x55 をxorすれば元の入力が復元できる。

6/8 Guess IP

プログラムは入力されたIPv4アドレスへUDPパケットを送り、同じネットワーク上のサーバがそれに反応してフラグを返す。ソケットには SO_BROADCAST が有効化されている。

プライベートIPを総当たりする必要はなく、宛先に 255.255.255.255 を指定すればよい。limited broadcastとして同一セグメントへ届き、サーバから返答が得られる。

6/9 A Piece of DHKE

Diffie-Hellmanの法は p-1 = 2 * 3 * q の形で、サーバは受け取った公開値が範囲内かしか確認していない。そこで位数3の元を公開値として送る。

gb = g^(2q) mod p とすると、共有鍵 gb^a は3通りにしかならない。サーバから返ってくるAES暗号文を3候補の鍵で復号し、paddingやフラグ形式が正しいものを選べばよい。

6/10 chmod-swapper

root権限のスクリプトが2つのパスを受け取り、簡単な禁止パス確認のあとでファイルモードを入れ替えてから nobody のシェルを起動する。内容は読めなくても、SUIDビットを別の実行ファイルへ移すことができる。

SUID rootの /usr/bin/passwd/bin/cat のmodeを交換する。すると /bin/cat がSUID rootになり、落とされたシェルから /bin/cat /flag.txt を実行してフラグを読める。

6/11 Alpaca Certification

TLS証明書に独自OIDのX.509拡張が入っている。設定ファイルでは 1.2.3.4.5.6 にUTF8Stringとしてフラグが埋め込まれている。ブラウザから確認可能。

6/12 Floating Equality

Pythonで float(x_str + "e9")float(x_str) * 1e9 を比較しており、差が一定以上ならフラグを出す。10進文字列から直接指数付きで読む経路と、一度binary floatにしてから掛ける経路で丸め方が変わる。

小数9桁まで入力できるので、境界近くの値を探す。例えば 0.000976564 は直接parse側ではきれいに 976564 になる一方、乗算側に丸め誤差が残り、閾値を超えて比較が崩れる。

6/13 Elliptic Equation