Daily Alpacahack-Short Writer

2026-01-17Team: 個人

いつものdaily

Overview

プログラムは Base32 文字列 b32 と Base64 文字列 b64 を受け取り、次を満たすときにExpected :)を表示する。

  • パディングが含まれない
  • デコード結果が一致する
  • len(b32) >= len(b64) ならフラグが出る

よってパディング無しで、デコード結果は一致させつつ、len(b32) より len(b64) を大きくすることがゴールになる。

Solution

おそらく、最も簡単なのは、両方のデコード結果を空バイト列 b'' に揃える方法である。 今回着目したのは「!」を入力した際の挙動である。

! は Base64 の有効文字ではないため、validate=False の挙動によりすべて無視される。 結果として空文字列を Base64 デコードしたのと同じ扱いになり、これも b'' になる。

したがって

b32 = ""(空文字)

b64 = "!!!!"(=を含まない任意の文字列)

とすると、

  • = を含まないのでパディング禁止条件は満たす。
  • b32decode("") == b64decode("!!!!") == b'' なので、デコード結果一致の条件も満たす。
  • 長さは len(b32) = 0,len(b64) = 4 であり、len(b32) < len(b64) が成立する。

よって条件をすべて満たすため、フラグが表示される。

Solver

from ptrlib import Socket

HOST = "34.170.146.252"
PORT = 60350

p = Socket(HOST, PORT)

p.recvuntil("Base32:")
p.sendline("")

p.recvuntil("Base64:")
p.sendline("!!!!")

p.interactive()