FEAT:🚩 (B-SIDE) AlpacaHack 「Long Flag Printer 2026」Medium
コンテナの設定と通信のキープ処理を利用するMisc問題
FEAT:🚩 (B-SIDE) AlpacaHack 「Long Flag Printer 2026」Medium
20260717-daily_alpaca-misc-medium-long_flag printer_2026
Summary
本問は,コンテナの設定と通信のキープ処理を利用するMisc問題です.
[!info] Challenge Info
- Category: Misc
- Description: おかげさまで Flag Printer 2026 のフラグが長くなりました
- Tools & TechStack:
- Python
- Socat
- Pwntools
- Release: 2026/07/19
階層構造
1
2
3
4
5
6
.
├── compose.yaml
├── Dockerfile
└── server.py
1 directory, 3 files
ソースコードの調査
ソースコードを見ると,0~30 までの総和でスリープしているため,トータルで 465 秒 (7.75分) 待てば全ての Flag が表示されるはずです.
しかし,途中で出力がされなくなります.
server.py
1
2
3
4
5
6
7
8
import time
flag = "Alpaca{******** DUMMY ********}"
assert len(flag) == 31
for i, c in enumerate(flag):
print(c, end="", flush=True)
time.sleep(i)
ソースコードにはそのような処理が無かったため,Dockerfile を読むと -T51 があるせいで,5秒以上双方向でデータのやり取りが行われないと,サーバからタイムアウトしてしまいます.
Dockerfile
1
CMD ["socat", "-T5", "tcp-listen:1337,fork,reuseaddr", "exec:'python server.py'"]
じゃあ,「5秒になる前にデータを送り続ければいいのでは? 簡単じゃん!」 と思い,色々試しましたが軒並み途中で出力が切れました.
- ダミーデータを送った時刻を記録し2秒ごとにチャンクのチェックを行い,変化があれば再びダミーデータを送り接続を維持する方法
- とにかく,データを短い間隔で送り絶対に接続が切れないようにする方法
なんでこんな簡単な問題が B-SIDE なんだろうと思っていましたが,普通にデバッグと調整が難しいです…
解法
ローカル環境では,TIMEOUT = 4.9 でうまくいきましたが,リモート環境だとタイムアウトしてしまうため 4.8 に下げています.
なぜか,最後の } 記号が出力されませんが,とりあえず動きました.
正直,通信状況?によって結果に揺らぎが生じます.
solver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from pwn import *
import re
PATTERN = re.compile(rb"Alpaca\{.*\}")
TIMEOUT = 4.8
p = remote("localhost", 1337)
part = b""
while True:
try:
chunk = p.recv(1, timeout=TIMEOUT)
except EOFError:
break
if chunk:
# データを受信できたとき
part += chunk
print(chunk.decode(), end="", flush=True)
# 最後まで取得できたとき
if re.search(PATTERN, part):
print("\n")
break
else:
# 応答がなければダミーデータを送信し,socatのタイマーリセット
p.send(b"\0")
print(f"Flag: {part.decode()}")
Post-Mortem & Dead ends
初めて,B-SIDE 解けた~! 面白かったけど,タイムアウトしまくるから調整がムズカッタ…
References
This post is licensed under CC BY 4.0 by the author.