Files
Kubok-Regionov/SuperEasySecret-Stegano/solve/extract_flag_super_easy.rs
2025-12-22 05:19:38 +03:00

42 lines
1.3 KiB
Rust

use image::open;
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Открываем изображение
let img = open(&Path::new("super_easy_secret.png"))?.to_rgb8();
// Извлекаем ровно 160 битов из красного канала (20 символов)
let mut bits = Vec::new();
for pixel in img.pixels().take(160) {
let lsb = pixel[0] & 1; // LSB красного канала
bits.push(lsb);
}
// Проверяем количество битов
if bits.len() < 160 {
return Err("Недостаточно битов для флага".into());
}
// Собираем биты в байты
let mut bytes = Vec::new();
for chunk in bits[..160].chunks(8) {
if chunk.len() == 8 {
let mut byte = 0u8;
for (i, &bit) in chunk.iter().enumerate() {
byte |= bit << (7 - i);
}
bytes.push(byte);
}
}
// Проверяем количество байтов
if bytes.len() < 20 {
return Err("Недостаточно байтов для флага".into());
}
// Берем первые 20 байт (длина флага)
let flag = String::from_utf8_lossy(&bytes[..20]);
println!("Flag: {}", flag);
Ok(())
}