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
なので、普通に探索すると難しいです。そこで、単調性を利用することが考えられます。
具体的な解答コードは別の記事で紹介します。