CTF Writeups

CTFのwriteupと実績をまとめるブログ

Ruby-Flag-Checker

2026/01/03 · Daily AlpacaHack(1/3)
#reversing#AlpacaHack

配布されたファイル

require 'prime';print "flag> ";puts(Prime::Generator23.new.take(23).zip(STDIN.read(23).bytes).map{|x,y|x^y}.pack("C*")=="Coufhlj@bixm|UF\\JCjP^P<"?"Correct!":"Incorrect!")

writeup

与えられたRubyのファイルは見にくいので、整形しました。

require 'prime'

EXPECTED = "Coufhlj@bixm|UF\\JCjP^P<"
GEN_SIZE = 23

print "flag> "
input = STDIN.read(GEN_SIZE)

primes = Prime::Generator23.new.take(GEN_SIZE)

decoded = primes.zip(input.bytes).map { |p, b| p ^ b }.pack("C*")

puts decoded == EXPECTED ? "Correct!" : "Incorrect!"

このプログラムでは、2から始めて順に23個の素数を生成した後にそれのXORを取って、それがEXPECTEDと一致するとCorrectになりFLAGがゲットできるというものです。なのでそれをそのままsolverで行います。

以下solverです。

require "prime"

expected = "Coufhlj@bixm|UF\\JCjP^P<"
gen_size = 23

primes = Prime::Generator23.new.take(gen_size)
flag_bytes = primes.zip(expected.bytes).map { |p, e| p ^ e }
flag = flag_bytes.pack("C*")

p primes
p flag_bytes
puts flag

FLAG : Alpaca{Super_power_gem}