ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

Rubyの標準ライブラリだけで簡単にCTFっぽい計算問題サーバを立ててみた

はじめに

令和CTFで解いた計算問題が楽しかったので、似たような問題を考えました。
また、自分でサーバーを立ててみて、知り合いに解かせてみました。

接続方法

13.114.188.239 23615にアクセスすれば接続できる。(ncコマンドなどを利用してください)

実装

Process.daemon

require 'socket'
require 'timeout'

server = TCPServer.new('0.0.0.0', '23615')
loop do
  socket = server.accept
  flag = true
  Thread.start(socket) do |s|
    s.write "10^5<=x<=10^15\n"
    s.write "Time Limit: 2s\n"
    (1..10).each do |i|
      s.write "Q. #{i}/10\n"
      x = rand(10**(i + 4)..10**(i + 5))
      z = rand(10 * i..100 * i)
      y = x**z
      s.write "x^#{z}=#{y}\n"
      s.write "x=?\n"
      l = nil
      begin
        Timeout.timeout(2) { l = s.gets }
      rescue StandardError
        s.write "Time's up\n"
        s.close
      end
      next if l.to_i == x

      s.write "Wrong answer\n"
      flag = false
      break
    end
    s.write "Conguratulation!!!\n" if flag
    s.close
  end
end

サーバー構築

EC2インスタンス上で、ruby server.rbとすれば良いだけ。セキュリティグループで指定したポート番号のTCP通信を許可する必要もある。
また、上のスクリプトを実行すれば、ローカル環境でも接続できます。その場合はlocalhost 23615に接続します。 停止するにはプロセスをkillする。

解答の方針

xの範囲が10^5<=x<=10^15なので、普通に探索すると難しいです。そこで、単調性を利用することが考えられます。
具体的な解答コードは別の記事で紹介します。