Init. import
This commit is contained in:
42
SuperEasySecret-Stegano/solve/extract_flag_super_easy.rs
Normal file
42
SuperEasySecret-Stegano/solve/extract_flag_super_easy.rs
Normal file
@@ -0,0 +1,42 @@
|
||||
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(())
|
||||
}
|
||||
BIN
SuperEasySecret-Stegano/solve/solve.jpg
Normal file
BIN
SuperEasySecret-Stegano/solve/solve.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
Reference in New Issue
Block a user