require 'pwn' A = 'A'.ord F = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025] SHIFTS = F.map { |x| x % 26 } def decrypt(str, shift) str.chars.map { |c| (((c.ord - A + F[shift]) % 26) + A).chr }.join end s = Sock.new('misc.2020.chall.actf.co', 20300) s.recvuntil("--------------------\n") loop do line = s.recvline if line[/^Shift ([^ ]*) by n=(\d+)$/] ciphertext = $1 shift = $2.to_i p [ciphertext, shift] s.recvuntil(': ') s.sendline(decrypt(ciphertext, shift)) else puts line exit(0) end end