Writeup Aria
01_General02_XOR

XOR Properties

Desc

Di challenge sebelumnya, kita melihat cara XOR bekerja pada level bit. Sekarang kita memakai properti XOR untuk membalik rangkaian operasi yang dipakai untuk mengenkripsi flag.

Pemahaman ini penting karena XOR sering muncul di kriptografi, terutama pada stream cipher, block cipher mode tertentu, dan masking data.

Ada empat properti utama XOR:

Commutative: A XOR B = B XOR A
Associative: A XOR (B XOR C) = (A XOR B) XOR C
Identity: A XOR 0 = A
Self-Inverse: A XOR A = 0

Commutative berarti urutan operand tidak berpengaruh. Associative berarti rangkaian XOR bisa dikelompokkan ulang tanpa mengubah hasil. Identity berarti XOR dengan 0 tidak mengubah nilai. Self-inverse berarti nilai yang di-XOR dengan dirinya sendiri akan menjadi 0.

Di bawah ini ada beberapa nilai yang saling berhubungan. Tiga key acak di-XOR satu sama lain, lalu dipakai untuk mengenkripsi flag. Dengan properti XOR, kita bisa membatalkan operasi tersebut dan mendapatkan flag.

KEY1 = a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
KEY2 ^ KEY1 = 37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
KEY2 ^ KEY3 = c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
FLAG ^ KEY1 ^ KEY3 ^ KEY2 = 04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf

Sebelum melakukan XOR, decode dulu setiap string hex menjadi bytes.

Attachment

Solution

Relasi yang diberikan:

KEY1 = diketahui
KEY2 XOR KEY1 = diketahui
KEY2 XOR KEY3 = diketahui
FLAG XOR KEY1 XOR KEY3 XOR KEY2 = diketahui

Karena A XOR A = 0, kita bisa mendapatkan:

KEY2 = KEY1 XOR (KEY2 XOR KEY1)
KEY3 = KEY2 XOR (KEY2 XOR KEY3)
FLAG = (FLAG XOR KEY1 XOR KEY3 XOR KEY2) XOR KEY1 XOR KEY3 XOR KEY2

Implementasi Python:

from pwn import xor

key1 = bytes.fromhex("a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313")
key2_xor_key1 = bytes.fromhex("37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e")
key2_xor_key3 = bytes.fromhex("c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1")
flag_mix = bytes.fromhex("04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf")

key2 = xor(key1, key2_xor_key1)
key3 = xor(key2, key2_xor_key3)
flag = xor(flag_mix, key1, key3, key2)

print(flag.decode())

bytes.fromhex() mengubah semua input hex menjadi bytes agar bisa di-XOR byte demi byte. Fungsi xor() dari pwntools dipakai untuk menggabungkan beberapa bytes dengan operasi XOR. Setelah semua key dibatalkan, .decode() mengubah bytes flag menjadi string.

With Cyberchef
  • XOR KEY1 with KEY2 XOR KEY1 to get KEY2

  • XOR KEY2 with KEY2 XOR KEY3 to get `KEY3

  • Input: a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313

mencari KEY2:

mencari KEY3:

mendecode flag:

Summary

Challenge ini menunjukkan kekuatan properti self-inverse pada XOR. Jika sebuah nilai pernah di-XOR dengan key yang sama, key tersebut bisa di-XOR lagi untuk membatalkan efeknya.

Flag

crypto{x0r_i5_ass0c1at1v3}

On this page