We're given an image file named `A_Real_Space_Hero.jpg`. Because this is forensics, we're dealing with something hidden inside the image.
![image](https://raw.githubusercontent.com/FITSEC/spaceheroes_ctf_24/main/forensics/Petey%20the%20Panther's%20Guide%20to%20the%20Galaxy/src/A_Real_Space_Hero.jpg)
We can start with checking the file with `exiftool`.
```bash--- redacted due to brevity ---Warning                         : Invalid JUMBF sequence number```
It looks like there is something strange with this image. Let's look further, and run `binwalk` against the image.
```bash258102        0x3F036         Zip archive data, at least v2.0 to extract, compressed size: 114, uncompressed size: 124, name: secrets/piece_104.png258267        0x3F0DB         Zip archive data, at least v2.0 to extract, compressed size: 150, uncompressed size: 198, name: secrets/piece_105.png258468        0x3F1A4         Zip archive data, at least v2.0 to extract, compressed size: 146, uncompressed size: 183, name: secrets/piece_106.png
# redacted due to brevity```
Okay we've definetly found something. Let's extract the zip archive again using `binwalk`.
```bashbinwalk -e A_Real_Space_Hero.jpg```
We're now given a directory, conveniently named "secrets", with hundreds of image files hidden within that directory. These files are named `piece_[number].png`, and as the name suggests, they are pieces of a larger image. There's a total of 400 pieces in the directory, and we can assume the image is 200px by 200px (as each piece is 20px by 20px).
```pythonfrom PIL import Imageimport os
pieces = [filename for filename in os.listdir("./secrets")]pieces.sort(key=lambda x: int(x.split("_")[1][:-4]))
first_piece = Image.open(os.path.join("./secrets", pieces[0]))width, height = first_piece.size
rows = len(pieces) // widthcolumns = width
assembled_image = Image.new("RGB", (width * columns, height * rows))
for i, filename in enumerate(pieces):    piece = Image.open(os.path.join("./secrets", filename))    x = (i % columns) * width    y = (i // columns) * height    assembled_image.paste(piece, (x, y))
assembled_image.save("final.png")print("saved")```
We're now given a QR code, which we can scan to get the flag. I just dragged the image onto CyberChef and got the flag.
![image](https://raw.githubusercontent.com/FITSEC/spaceheroes_ctf_24/main/forensics/Petey%20the%20Panther's%20Guide%20to%20the%20Galaxy/src/small.png)
```shctf{s0_l0ng_4nd_th4nks_f0r_4ll_th3_flags}```
(hey look, it's a reference!)