XOR Starter

문제 및 설명

XOR은 비트가 같으면 0을 반환하고, 그렇지 않으면 1을 반환하는 비트 연산자입니다. 교과서에서 XOR 연산자는 ⊕로 표시되지만, 대부분의 문제와 프로그래밍 언어에서 '^'이 대신 사용되는 것을 볼 수 있습니다.



더 긴 이진수의 경우, 0110 ^1010 = 1100 비트 단위로 XOR를 수행합니다. 
우리는 먼저 정수를 십진법에서 이진법으로 변환하여 정수를 XOR할 수 있다. 
먼저 각 문자를 유니코드 문자를 나타내는 정수로 변환하여 문자열을 XOR할 수 있습니다.

문자열 'label'과 정수 13과 XOR 하십시오.
이러한 정수를 다시 문자열로 변환하고 플래그를 crypto{new_string}(으)로 제출하십시오.


풀이

더보기

문제에서 'label'이라는 문자열을 13인 정수와 xor연산을 하라고 했다. 

from pwn import *

ciphertext = 'label'
print(xor(cipher, 13))

플래그 값은 crypto{aloha}이다.

 

XOR Properties

문제 및 설명

지난 문제에서는 XOR가 비트 수준에서 어떻게 작동하는지 살펴보았습니다.
여기서는 XOR 작업의 속성을 다루고 플래그를 암호화한 일련의 작업을 실행 취소하는 데 사용할 것입니다.
이것이 어떻게 작동하는지에 대한 직관을 얻는 것은 나중에 실제 암호 시스템, 특히 블록 암호 범주를 공격할 때 큰 도움이 될 것이다.

XOR 연산자를 사용하여 문제를 해결할 때 고려해야 하는 네 가지 주요 속성이 있습니다





이것을 분해해 봅시다. 교환속성은 XOR 연산의 순서가 중요하지 않다는 것을 의미합니다.
연관속성은 일련의 작업이 순서 없이 수행될 수 있다는 것을 의미합니다(괄호에 대해 걱정할 필요가 없습니다).
정체성은 0이므로 0을 가진 XOR은 되지않고
마지막으로  자기 반전 속성은 자기 자신을 XOR하면 0을 반환한다.

이것을 실행에 옮깁시다! 
다음은 세 개의 임의 키가 함께 및 플래그와 함께 XOR된 일련의 출력입니다. 
위의 속성을 사용하여 플래그를 얻기 위해 마지막 줄의 암호화를 실행 취소합니다.



💡이러한 개체를 XOR하기 전에 16진수에서 바이트로 디코딩해야 합니다.

풀이

더보기

Self-Inverse특성을 이용하면

FLAG ^ KEY1 ^ KEY3 ^ KEY2값을

KEY1 ^ KEY3 ^ KEY2 값으로 xor연산시키면된다.

 

현재 KEY1의 값과, KEY2 ^ KEY3에 대한 값이 있기 때문에

from pwn import xor
key1 = bytes.fromhex('a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313')
key2_3 = bytes.fromhex('c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1')
flag = bytes.fromhex('04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf')
flag = xor(flag, key1, key2_3)
print(flag)

플래그값은 crypto{x0r_i5_ass0c1at1v3}이다.

Favourite byte

문제

앞으로 몇 가지 문제를 해결하기 위해 방금 배운 내용을 사용하여 몇 가지 XOR 퍼즐을 더 풀게 될 것입니다.

나는 XOR를 사용하여 데이터를 하나의 바이트로 숨겼지만, 그 바이트는 비밀이다. 
먼저 16진수에서 디코딩하는 것을 잊지 마십시오.


73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d

풀이

더보기

하나의 바이트 단일바이트와 xor연산을 했는데

이는 모르기 때문에 하나씩 다 넣어보며

플래그값 일부 중 하나인 crypto라는 키워드가 나올때까지

브루트포싱을 하였다.

from pwn import xor
ciphertext=bytes.fromhex('73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d')
for i in range(256):
        plaintext = xor(ciphertext, i)
        if b'crypto' in plaintext : 
                print(plaintext)

플래그값은 crypto{0x10_15_my_f4v0ur173_by7e}이다.

You either know, XOR you don't

문제

나는 비밀키로 플래그값을 암호화했는데, 당신은 절대 추측할 수 없을 것이다.

💡깃발 형식과 깃발이 이 도전에 어떻게 도움이 되는지 기억하세요!

0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104

풀이

더보기

먼저 문제에서 제시한 암호문은 flag값과 비밀 키값과 암호화가 되어있다.

그리고 플래그값 형식을 써먹으라는고한다.

 

그러면 암호문은 

flag값 ^ 비밀 키 =암호문 이러한 형식으로 되어있을 것이다.

플래그값은 'crypto{}'이러한 형식으로 나올 것이고,

비밀키는 암호문과 플래그값을 xor시키면 나올 것이다.

 

 

from pwn import *

ciphertext = bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104')
key = xor(ciphertext, 'crypto{')
print(key)

 출력을 하였더니

myXORke외에 이상하게 출력이 되는걸 볼수있다.

myXORke로나와 y철자가 빠진거 같아 일단 myXORkey로 잡고

flag값은 암호문^비밀키로 하면 될거 같아

from pwn import xor

ciphertext = bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104')
key=b'myXORkey'

print(xor(ciphertext, key))

flag값이 출력되었다.

flag값은 crypto{1f_y0u_Kn0w_En0uGH_y0u_Kn0w_1t_4ll}이다.

Lemur XOR

문제

XOR의 멋진 이미지 두 개를 같은 비밀 키로 숨겨서 볼 수 없게 했어요!

💡이 문제는 파일의 모든 데이터 바이트에 대한 XOR가 아니라 두 이미지의 RGB 바이트 사이에서 시각적 XOR를 수행해야 합니다.

풀이

더보기
flag.png

 

lamur.png

문제에선 이미지 파일을 2개를 제공한다.

두 이미지를 xor해야하니

opencv를 이용하여 둘을 xor 시켰다. 

import cv2
img1 = cv2.imread("flag.png")
img2 = cv2.imread("lemur.png")

xor_img = cv2.bitwise_xor(img1,img2) #이미지 xor연산

cv2.imshow("flag", xor_img) #xor한 이미지 출력 

cv2.waitKey() 
cv2.destroyAllWindows()

플래그 값은 crypto{X0Rly_n0t!}이다.

 

복사했습니다!