[CryptoHack] GENERAL(XOR Starter, XOR Properties, Favourite byte, 'You either know, XOR you don't', Lemur XOR)
- -
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를 수행해야 합니다. |
풀이
문제에선 이미지 파일을 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!}이다.
'워게임 > CryptoHack' 카테고리의 다른 글
[Cryptohack] SYMMETRIC CIPHERS (CTRIME) (0) | 2023.05.12 |
---|---|
[CryptoHack] SYMMETRIC CIPHERS(Bean Counter) (0) | 2023.05.11 |
[CryptoHack] SYMMETRIC CIPHERS(PASSWORDS AS KEYS) (0) | 2023.05.09 |
[CryptoHack] SYMMETRIC CIPHERS(Flipping Cookie) (0) | 2023.05.08 |
[CryptoHack] SYMMETRIC CIPHERS(ECB ORACLE) (0) | 2023.05.07 |