Writeup Aria
01_General02_XOR

Lemur XOR

Desc

Challenge ini menyembunyikan dua gambar dengan cara meng-XOR nilai RGB pixel menggunakan key rahasia yang sama. Karena kedua gambar memakai key yang sama, kita bisa meng-XOR kedua gambar tersebut untuk menghilangkan key dan memunculkan informasi tersembunyi.

Konsepnya mirip dengan properti XOR:

(image_1 XOR key) XOR (image_2 XOR key) = image_1 XOR image_2

Karena key XOR key = 0, efek key hilang. Yang perlu diperhatikan, challenge ini meminta XOR pada nilai RGB setiap pixel, bukan XOR seluruh byte file PNG mentah. Jadi gambar harus dibuka sebagai image, dibaca pixel-nya, lalu array pixel-nya di-XOR.

Attachment

Solution

Download kedua gambar terlebih dahulu.

wget https://cryptohack.org/static/challenges/lemur_ed66878c338e662d3473f0d98eedbd0d.png -O lemur.png
wget https://cryptohack.org/static/challenges/flag_7ae18c704272532658c10b5faad06d74.png -O flag.png

file lemur.png flag.png
# lemur.png: PNG image data, 582 x 327, 8-bit/color RGB, non-interlaced
# flag.png:  PNG image data, 582 x 327, 8-bit/color RGB, non-interlaced

Kedua gambar memiliki resolusi dan mode warna yang sama, jadi setiap pixel bisa dipasangkan langsung. Setelah itu, lakukan XOR pada nilai RGB masing-masing pixel.

import numpy as np
from PIL import Image

img1 = Image.open("lemur.png")
img2 = Image.open("flag.png")

arr1 = np.array(img1)
arr2 = np.array(img2)

result = np.bitwise_xor(arr1, arr2)
result_img = Image.fromarray(result)
result_img.save("result.png")

Penjelasan script:

  • Image.open() dari Pillow membuka file PNG sebagai object gambar.
  • np.array(img) mengubah gambar menjadi array NumPy berisi nilai RGB setiap pixel.
  • np.bitwise_xor(arr1, arr2) melakukan XOR antar array pixel dengan posisi yang sama.
  • Image.fromarray(result) mengubah array hasil XOR kembali menjadi gambar.
  • save("result.png") menyimpan hasilnya agar bisa dilihat.

Hasil gambar:

1787945190695

Summary

Challenge ini memperlihatkan bahwa XOR juga bisa diterapkan pada data visual. Kuncinya adalah memproses RGB pixel, bukan byte file PNG langsung, karena format PNG punya struktur metadata dan kompresi sendiri.

Flag

crypto{X0Rly_n0t!}

On this page