Skip to content
MSB
📅 Apr 13, 2026

MSB

"This image passes LSB statistical analysis, but we can't help but think there must be something to the visual artifacts present in this image..."


MSB¤

Đề bài¤

Bước 1: Xác định định dạng thông tin file¤

1

Hình 1. Nội dung Challenge

Mô tả

Ảnh vượt qua các bài kiểm tra thống kê LSB thông thường nhưng xuất hiện các "dấu vết thị giác" (visual artifacts) lạ.

2

Hình 2. Tải file

3

Hình 3. Xem thông tin file

Phân tích ban đầu

Sử dụng các công cụ cơ bản để kiểm tra cấu trúc file:

  • file: Xác nhận là định dạng PNG chuẩn.
  • binwalk: Không phát hiện dữ liệu ẩn hoặc file đính kèm ở cuối (no trailing data).
  • exiftool: Metadata sạch, không có thông tin nhạy cảm.
  • pngcheck -v: Các khối IDAT hoàn toàn bình thường.

4

Hình 4.1. PNG check

Hình 4.2. PNG check

5

Hình 5. Ảnh hiện thị ban đầu

Bước 2: Dùng các công cụ¤

Dùng stegsolve¤

6

Hình 6. Dùng stegsolve vẫn không ra

Dùng zsteg¤

7

Hình 7. Dùng zsteg vẫn không ra

Bước 3: Hướng tiếp cận khác¤

Note

Gợi ý về "visual artifacts" và việc LSB bị loại bỏ cho thấy kỹ thuật giấu tin nằm ở các bit có trọng số cao hơn. Cụ thể là MSB (Most Significant Bit - Bit 7). Khi thay đổi bit này, màu sắc của ảnh sẽ bị biến đổi nhẹ tạo ra các dải nhiễu mà mắt thường có thể lờ mờ nhận ra. Chúng ta xây dựng một script Python để trích xuất bit thứ 7 (MSB) từ mỗi kênh màu (R, G, B) của từng pixel, sau đó ghép lại thành chuỗi nhị phân và chuyển đổi sang định dạng ASCII.

Script tự động:

solve.py
from PIL import Image

def extract_msb_bits(image_path):
    img = Image.open(image_path)
    pixels = list(img.getdata())

    bitstream = ""

    for pixel in pixels:
        if isinstance(pixel, tuple):
            for channel in pixel[:3]: 
                msb = (channel & 0b10000000) >> 7
                bitstream += str(msb)
        else:
            msb = (pixel & 0b10000000) >> 7
            bitstream += str(msb)

    return bitstream

def bits_to_ascii(bitstream):
    chars = []
    for i in range(0, len(bitstream), 8):
        byte = bitstream[i:i+8]
        if len(byte) < 8:
            continue
        ascii_char = chr(int(byte, 2))
        chars.append(ascii_char)
    return ''.join(chars)

if __name__ == "__main__":
    image_path = "Ninja-and-Prince-Genji-Ukiyoe-Utagawa-Kunisada.flag.png" 
    bitstream = extract_msb_bits(image_path)
    hidden_text = bits_to_ascii(bitstream)
    print(hidden_text)

Flag¤

Hình 8. Kết quả Flag
Flag
picoCTF{15_y0ur_que57_qu1x071c_0r_h3r01c_3a219174}