QR Repair
โจทย์นี้เป็นข้อ QR Repair จากงาน SECPlayground Cybersplash 2026 หมวด Misc และเป็นโจทย์ที่ตอนเห็นครั้งแรกแล้วชวนให้คิดไปทาง “คงต้องนั่งซ่อมรูปก่อนแน่ ๆ”
ตัวโจทย์ให้ QR code ที่มีส่วนของภาพถูกรบกวนอยู่ตรงกลาง ถ้าหยิบไปสแกนกับแอปทั่ว ๆ ไปก็มีโอกาสอ่านไม่ออก เพราะมี artifact สีมาบังบางส่วนของข้อมูล
We recovered a QR code from a damaged hard drive, but it appears to be partially corrupted. Colored artifacts cover parts of the code, and our standard scanning tools can't read it. Can you repair the QR code and recover the hidden data?
Answer Format:
misc{.....}
ภาพที่ได้มาก็ประมาณนี้

ตอนแรกคิดยังไง
พอเห็น QR โดนบัง หลายคนรวมถึงผมด้วยอาจนึกถึงวิธีพวกนี้ก่อน:
ลบ artifact ออกเอง
crop หรือ threshold ภาพใหม่
ปรับ contrast
หาเว็บหรือแอปช่วย repair QR
ซึ่งก็ไม่ได้ผิด แต่โจทย์แบบนี้มีจุดที่ควรนึกให้ออกก่อนอย่างหนึ่งคือ
QR code ถูกออกแบบมาให้ทนความเสียหายได้ระดับหนึ่งอยู่แล้ว
พูดง่าย ๆ คือ ต่อให้บางส่วนหายไปหรือมีอะไรมาบัง มันก็ยังมีโอกาสอ่านได้ ถ้าใช้ตัวถอดรหัสที่ดีพอ
ตรงนี้แหละที่ทำให้ไม่จำเป็นต้องรีบไปนั่งรีแพร์ภาพตั้งแต่ต้น
ทำไมยังมีโอกาสอ่านได้ทั้งที่ภาพเสีย
QR code มีระบบ error correction อยู่ในตัว
เลยทำให้มันยัง decode ได้ แม้ข้อมูลบางส่วนจะหายหรือเพี้ยนไปบ้าง
ดังนั้นโจทย์นี้ไม่ได้จำเป็นต้องวัดฝีมือแต่งภาพอย่างเดียว แต่อาจกำลังวัดว่าเรารู้หรือเปล่าว่า มีเครื่องมือที่รองรับการอ่าน QR ที่เสียหายได้โดยตรง
พอคิดมาถึงตรงนี้ ทางเลือกที่เร็วที่สุดเลยกลายเป็น
ลองโยนภาพให้ตัว decoder ดี ๆ อ่านก่อน
วิธีที่ใช้
ใน Python มี cv2 จาก OpenCV ซึ่งมีคลาส QRCodeDetector() สำหรับตรวจจับและถอดรหัส QR code ได้เลย
เลยลองเขียนสั้น ๆ แบบนี้
import cv2
img = cv2.imread("damaged_qr.png")
text, pts, _ = cv2.QRCodeDetector().detectAndDecode(img)
print(text)
จุดที่ชอบมากของวิธีนี้คือมันตรงไปตรงมามาก
ไม่ต้องมานั่งลบสี่เหลี่ยมสีออกทีละก้อน ไม่ต้องแปลงภาพหลายรอบก่อน ลอง decode ตรง ๆ ก่อนเลย ถ้าอ่านได้ก็จบ
ผลลัพธ์
พอรันแล้ว OpenCV สามารถอ่านข้อความจาก QR ได้ออกมาเลย

ค่าที่ได้คือ
misc{R3pa1r_M3_P73@s3}
ซึ่งก็คือ flag ของข้อนี้
สิ่งที่น่าสนใจของข้อนี้
สิ่งที่ทำให้โจทย์นี้น่าสนใจคือมันหลอกให้เราอยาก “ซ่อม” ก่อน ทั้งที่จริง ๆ แล้วอาจไม่ต้องซ่อมเลย
ถ้ามองในมุม CTF ข้อนี้เป็นตัวอย่างที่ดีของโจทย์ที่ไม่ได้ต้องการขั้นตอนเยอะ แต่ต้องการให้เราเลือกทางให้ถูกก่อน
เพราะถ้าเริ่มจากเครื่องมือที่เหมาะ เราจะข้ามงานจุกจิกไปได้ทันที
มันเลยเป็นโจทย์ที่เตือนว่า:
เห็นไฟล์เสีย ไม่ได้แปลว่าต้องรีแพร์เองเสมอไป
บางทีตัว parser หรือ decoder ก็เก่งพอจะจัดการให้เราอยู่แล้ว
ถ้าเจอโจทย์คล้าย ๆ กันอีกควรทำยังไง
ถ้าครั้งหน้าเจอแนว QR พัง, QR เบลอ, QR มีรอยบัง หรือ QR อ่านไม่ออกจากแอปธรรมดา ผมว่าลองตามลำดับนี้ได้เลย
ลองใช้ตัวอ่าน QR ที่เก่งขึ้นก่อน เช่น OpenCV
ถ้ายังไม่ได้ ค่อยไปทางปรับภาพ เช่น grayscale, threshold, sharpen
ถ้ายังไม่ได้อีก ค่อยลองรีแพร์ภาพด้วยมือหรือ masking บางส่วน
ถ้าโจทย์ซับซ้อนมาก ค่อยคิดต่อว่ามีการดัดแปลงเชิงโครงสร้างของ QR หรือไม่
ลำดับแบบนี้จะช่วยประหยัดเวลากว่าเริ่มจากงานหนักทันที
สรุป
ข้อนี้แก้ไม่ยาก แต่เป็นโจทย์ที่ดีมากสำหรับเตือน mindset เวลาเจอไฟล์ที่ดูเสียหาย
เส้นทางของโจทย์นี้คือ:
ได้ภาพ QR ที่มี artifact มาบัง
สังเกตว่าถึงจะเสีย แต่ QR ยังอาจอ่านได้เพราะมี error correction
ลองใช้
cv2.QRCodeDetector()อ่านตรง ๆได้ข้อความออกมาเป็น flag ทันที