คลัง
stego

PNG Steganography

PNG เป็น format ยอดนิยมในโจทย์ stego เพราะเป็น lossless และมีโครงสร้าง chunk ที่ซ่อนข้อมูลได้หลายจุด — LSB, chunk ที่ผิดปกติ, ข้อมูลต่อท้าย IEND, ขนาดภาพที่ถูกตัด บทนี้ลงลึกถึงโครงสร้าง PNG ทุก chunk และทุกจุดที่ซ่อนข้อมูลได้ พร้อมวิธีตรวจ

IntermediateAdvanced#png#stego#chunk#idat#appended-data#pngcheck#ctf

1. โครงสร้าง PNG

PNG เริ่มด้วย magic bytes 89 50 4E 47 0D 0A 1A 0A ตามด้วย chunk เรียงต่อกัน แต่ละ chunk = [length(4)] [type(4)] [data] [CRC(4)] chunk สำคัญ: IHDR (header: ขนาด/สี), IDAT (ข้อมูลภาพบีบอัด), IEND (จบไฟล์) — ข้อมูลซ่อนได้ทั้งใน chunk, ระหว่าง chunk, และหลัง IEND

โครงสร้าง PNG และจุดที่ซ่อนข้อมูลได้
magic: 89 50 4E 47 0D 0A 1A 0A IHDR — width, height, bit depth, color type ← แก้ height ซ่อนภาพส่วนล่าง tEXt / zTXt / iTXt — ข้อความ (metadata) ← flag ใน text chunk IDAT — pixel data (บีบอัด) → LSB ซ่อนตรงนี้ IEND — จบไฟล์ ข้อมูลต่อท้าย IEND (appended) ← binwalk หาเจอ

2. Triage — ตรวจทุกจุดตามลำดับ

ชุดคำสั่งตรวจ PNGLinux
# 1. ยืนยันชนิด + ขนาดจริง
file image.png
identify -verbose image.png        # ImageMagick: ดู metadata เต็ม

# 2. ตรวจ chunk เสีย/ผิดปกติ (สำคัญมาก)
pngcheck -vtp7 image.png
# มองหา: CRC error, chunk แปลก, ข้อมูลหลัง IEND

# 3. metadata + text chunk
exiftool image.png
# tEXt/zTXt/iTXt อาจมี flag ตรงๆ

# 4. ข้อมูลฝัง/ต่อท้าย
binwalk image.png                  # หาไฟล์ฝัง
binwalk -e image.png               # แยกออกมา
strings image.png | grep -iE 'flag|ctf'

# 5. LSB (ดูหัวข้อ LSB)
zsteg -a image.png
pngcheck -vtp7 คือหัวใจ — บอก CRC error และข้อมูลที่เกินโครงสร้างปกติ

3. เทคนิค: แก้ความสูงภาพ (ซ่อนใน IHDR)

เทคนิคคลาสสิก: ผู้ซ่อนเขียน flag ที่ส่วนล่างของภาพ แล้วแก้ค่า height ใน IHDR ให้น้อยลง ทำให้ viewer แสดงแค่ส่วนบน flag ถูกซ่อนใต้ขอบ การแก้คือเพิ่ม height กลับ หรือซ่อม IHDR

ตรวจและแก้ heightLinux
# pngcheck จะเตือนถ้า CRC ของ IHDR ผิด (สัญญาณว่าถูกแก้ height)
pngcheck -v image.png

# แก้ด้วย Python — เพิ่ม height แล้วคำนวณ CRC ใหม่
python3 << 'PY'
import struct, zlib
d = open("image.png","rb").read()
i = d.index(b'IHDR')
w = struct.unpack(">I", d[i+4:i+8])[0]
# ตั้ง height ใหม่ให้ใหญ่ขึ้น (เช่นเท่า width หรือค่าที่เดา)
new_h = 1000
chunk = d[i:i+4] + d[i+4:i+8] + struct.pack(">I", new_h) + d[i+12:i+17]
crc = zlib.crc32(d[i:i+8] + struct.pack(">I", new_h) + d[i+12:i+17]) & 0xffffffff
out = d[:i+8] + struct.pack(">I", new_h) + d[i+12:i+17] + struct.pack(">I", crc) + d[i+21:]
open("fixed.png","wb").write(out)
PY
เครื่องมือสำเร็จรูปทำได้เช่นกัน แต่เข้าใจกลไกช่วยแก้เคสแปลกๆ ได้

4. สรุปจุดซ่อนทั้งหมดใน PNG

จุดซ่อนตรวจด้วยหมายเหตุ
LSB ใน IDATzsteg, StegSolveพบบ่อยสุด (ดูหัวข้อ LSB)
tEXt/zTXt/iTXt chunkexiftool, pngcheckข้อความ/flag ตรงๆ
height ที่ถูกตัด (IHDR)pngcheck (CRC error)flag ใต้ขอบภาพ
ข้อมูลหลัง IENDbinwalk, hex editorไฟล์/text ต่อท้าย
chunk ปลอม/ไม่มาตรฐานpngcheck -vdata ใน chunk ที่ตั้งชื่อเอง
palette (PLTE) ผิดปกติStegSolveสีใน palette ซ่อนข้อมูล

5. Quick Reference

  • triage: file → pngcheck -vtp7 → exiftool → binwalk → zsteg
  • pngcheck CRC error = chunk ถูกแก้ (มัก height)
  • text chunk (tEXt/zTXt/iTXt) → exiftool ดู flag
  • height ถูกตัด → เพิ่ม height + คำนวณ CRC ใหม่
  • ข้อมูลหลัง IEND → binwalk -e
  • LSB → zsteg/StegSolve (ดูหัวข้อ LSB)
  • PLTE palette → StegSolve

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติโจทย์แจกไฟล์ .png มา มีแค่ Kali เปล่าๆ — PNG ซ่อนได้หลายจุด (chunk, height, LSB, append) ทำตามลำดับนี้ทีละขั้น เช็คโครงสร้างก่อนค่อยไป LSB

  1. 1พิมพ์ file image.png และ identify -verbose image.png — ดูขนาด/สี metadata เบื้องต้น
  2. 2พิมพ์ pngcheck -vtp7 image.png — หัวใจของการตรวจ PNG มองหา CRC error, chunk แปลก, ข้อมูลเกินหลัง IEND
  3. 3ถ้า pngcheck เตือน CRC error ที่ IHDR ให้สงสัยว่า height ถูกแก้ให้ต่ำกว่าจริง (flag ซ่อนใต้ขอบภาพ) — ใช้ script Python ในหัวข้อนี้แก้ height แล้วเปิดใหม่
  4. 4พิมพ์ exiftool image.png — เช็ค tEXt/zTXt/iTXt chunk อาจมี flag ตรงๆ
  5. 5พิมพ์ binwalk image.png แล้ว binwalk -e image.png — เช็คข้อมูลที่ต่อท้ายหลัง IEND
  6. 6พิมพ์ zsteg image.png — ลอง LSB combination อัตโนมัติ
  7. 7ถ้าไม่เจอ ลอง zsteg -a image.png ละเอียดขึ้น
  8. 8ถ้ายังไม่เจอ เปิดใน StegSolve ไล่ดู bit-plane ด้วยตา และดู palette (PLTE) ถ้าเป็นภาพ indexed color
  9. 9ถ้าครบทุกจุดแล้วยังไม่เจอ รัน stegoveritas image.png กวาดทุกอย่างรวดเดียวเป็นด่านสุดท้าย
ไล่ตรวจ PNG ทีละจุด — ติดไปไหนต่อ
pngcheck -vtp7 image.png
ตรวจโครงสร้าง chunk/CRC ก่อนเสมอ
เจอ CRC error / chunk ผิดปกติไหม?
✅ เจอ (มัก IHDR)→ สงสัย height ถูกแก้ → แก้ height + CRC ใหม่
❌ ไม่เจอ→ เช็ค metadata/text chunk ต่อ
แก้ height ใน IHDR + คำนวณ CRC ใหม่ (Python)
เจอ flag ใน text chunk ไหม?
✅ เจอ→ จบ ได้ flag
❌ ไม่เจอ→ เช็คข้อมูลต่อท้ายด้วย binwalk
เจอไฟล์ต่อท้ายไหม?
✅ เจอ→ extract หา flag จบ
❌ ไม่เจอ→ ไป LSB ด้วย zsteg
zsteg เจอไหม?
✅ เจอ→ zsteg -E ดึงออกมา จบ
❌ ไม่เจอ→ ไล่ดู bit-plane ด้วยตา / PLTE
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
ตรวจโครงสร้าง chunk/CRCpngchecksudo apt install pngcheckaperisolve.com
เช็ค metadata/text chunkexiftoolsudo apt install libimage-exiftool-perlexifdata.com
เช็คข้อมูลต่อท้าย/ฝังbinwalksudo apt install binwalkaperisolve.com
ลอง LSB อัตโนมัติzsteggem install zstegstylesuxx.github.io/steganography
ดู bit-plane/palette ด้วยตาStegSolve (java -jar)wget stegsolve.jar-
แก้ height/CRC เองpython3 (struct, zlib)--
กวาดทุกวิธีรวดเดียวstegoveritaspipx install stegoveritasaperisolve.com
🚑 ถ้าตันสนิท ลองท่าถัดไป: zsteg เจาะลึก notation และการดึงข้อมูล, lsb ถ้าอยากเข้าใจกลไก bit-plane และเขียน solver เอง, binwalk ถ้ายังไม่เช็คข้อมูลต่อท้ายให้ทั่ว, exiftool ถ้ายังไม่เช็ค metadata — PNG มีจุดซ่อนได้หลายชั้นพร้อมกัน อย่าหยุดแค่เจอจุดเดียวถ้าโจทย์ให้คะแนนหลายส่วน

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้