# Light SaBer solve
### There are only two pictures in the file.


---
### Use HxD to open the help.png image and modify its height.

>## Get the picture below, which says ASCII CODE.
>
---
### Use stegsolve to open and check the image.


---
>## You can find that Blue Plane 0 seems to have a missing qrcode.
>
---
### Save the image, splice the Qrcode and scan it to get a URL.

> ## https://webtes.onrender.com/
---
### Go to the website and you will see an interface where you can upload files and enter messages.

### Try to upload the image and use stegsolve to check the returned image.


> ## Get the picture below
>
### Found that some pixels were changed



### It is speculated that LSB steganography using ascii code is used to send three different color images for checking.
>## etect B channel
>
>## etect R channel
>
>## etect G channel
>
> ## Presumably using the G 'green' channel
---
### Write a script to check the modified pixel coordinate position of the image and record it
```
from PIL import Image
import numpy as np
image_path_1 = r"C:\Users\Maxsu\OneDrive\桌面\image1.png"
image_path_2 = r"C:\Users\Maxsu\OneDrive\桌面\image2.png"
def compare_images_and_print(image_path_1, image_path_2):
# Load the images
image1 = Image.open(image_path_1)
image2 = Image.open(image_path_2)
# Convert images to numpy arrays
array1 = np.array(image1)
array2 = np.array(image2)
# Check if both images have the same size
if array1.shape != array2.shape:
raise ValueError("Images do not have the same size")
# Find the pixels that are different
diff = array1 != array2
diff_coords = np.where(diff)
if np.any(diff): # If there are any differences
# Extract the modified pixel values from both images
modified_pixels_image1 = array1[diff_coords]
modified_pixels_image2 = array2[diff_coords]
# Prepare the data to be printed
differences = list(zip(zip(*diff_coords), modified_pixels_image1, modified_pixels_image2))
# Define a custom sorting function based on y, then x values
def custom_sort(item):
coords, orig_pixel, mod_pixel = item
return (coords[1], coords[0]) # Sort by y first, then x
# Sort the differences list using the custom sorting function
differences.sort(key=custom_sort)
# Print the differences
for coords, orig_pixel, mod_pixel in differences:
print(f"Coordinates: {coords}, Original: {orig_pixel}, Modified: {mod_pixel}")
else: # If the images are the same
print("圖片相同")
# Run the comparison and catch any exceptions
try:
compare_images_and_print(image_path_1, image_path_2)
except ValueError as e:
print(e)
```
---
#### Presumed to be ascii code conversion, use ÿ character to test the website
#### Enter messages of different lengths and you will find that up to 24 pixels will be modified.


---


---


---


---
>## Can detect up to three steganographic characters and record their coordinate sequence
>first character(57, 57), (58, 8), (63, 54), (94, 46), (96, 160),(135, 88), (138, 110), (157, 169)
>second character(4, 184), (6, 59),(25, 0), (63, 178), (84, 90), (144, 177), (145, 123),(149, 91)
>third character (40, 56), (55, 153), (101, 157), (108, 9),
(131, 55), (134, 115), (186, 153), (194, 36)
### According to the rules obtained from the records, it is found that ascii code is used
### Use record coordinates to write a script to decrypt flag.png
---
```
from PIL import Image
def lsb_decrypt_print_ascii_and_message(image_path, coordinates):
try:
# Load the image for decoding
image = Image.open(image_path)
pixels = image.load()
# Retrieve the binary bits from the image's LSB of the green channel
binary_bits = ''
for coord in coordinates:
x, y = coord
pixel = list(pixels[x, y])
# Extract the LSB of the green channel
binary_bits += str(pixel[1] & 1)
# Chunk the binary string into bytes of 8 bits
binary_chunks = [binary_bits[i:i+8] for i in range(0, len(binary_bits), 8)]
# Convert binary bytes to ASCII codes
ascii_codes = [int(binary, 2) for binary in binary_chunks]
# Convert binary bytes to ASCII characters
message = ''.join([chr(code) for code in ascii_codes])
# Print out the ASCII codes and the message
print("ASCII Codes:", ascii_codes)
print("Decoded Message:", message)
return ascii_codes, message
except Exception as e:
print(f"Error decoding image: {e}")
return None, None
# Coordinates provided in the original script
coordinates = [
(57, 57), (58, 8), (63, 54), (94, 46), (96, 160),
(135, 88), (138, 110), (157, 169), (4, 184), (6, 59),
(25, 0), (63, 178), (84, 90), (144, 177), (145, 123),
(149, 91), (40, 56), (55, 153), (101, 157), (108, 9),
(131, 55), (134, 115), (186, 153), (194, 36)
]
# Placeholder for the actual path to the image
# Make sure to replace this with the actual path where the image is stored on your computer
image_path = r"C:\Users\Maxsu\OneDrive\桌面\encoded_falg1 (2).PNG"
# Decrypt the message and print both ASCII codes and the decoded message
ascii_codes, message = lsb_decrypt_print_ascii_and_message(image_path, coordinates)
```
### get flag

MCDX{orz}