Home (cryptohack) general, Xor
Post
Cancel

(cryptohack) general, Xor

이번엔 XOR 관련 문제들이다.

General

XOR

XOR Starter

Given the string label, XOR each character with the integer 13.
Convert these integers back to a string and submit the flag as crypto{new_string}.

label이라는 문자열을 13이랑 xor해서 새로운 문자열을 만들라고 한다.

1
2
3
4
s="label"

for i in s:
    print(chr(ord(i)^13), end="")

를 하면 aloha가 나온다.

crypto{aloha}

XOR Properties

1
2
3
4
KEY1 = a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
KEY2 ^ KEY1 = 37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
KEY2 ^ KEY3 = c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
FLAG ^ KEY1 ^ KEY3 ^ KEY2 = 04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf

XOR의 특성을 이용한 문제이다.
(A^B)^B == A 이기 때문에 같은 값을 xor 연산 해주면 FLAG를 얻을 수 있다.
위의 KEY부터 하나하나 계산해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import * # pip install pwntools
import json
import base64
import codecs
from Crypto.Util.number import long_to_bytes

KEY1 = 0xa6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
KEY2 = 0x37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e ^ KEY1
print(KEY2)
KEY3 = 0xc1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1 ^ KEY2

FLAG=0x04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf ^ KEY1 ^ KEY2 ^ KEY3
print(long_to_bytes(FLAG))
#KEY1 = 0xa6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
#KEY2 ^ KEY1 = 37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
#KEY2 ^ KEY3 = c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
#FLAG ^ KEY1 ^ KEY3 ^ KEY2 = 04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf

b’crypto{x0r_i5_ass0c1at1v3}’가 flag다.

Favourite byte

1
73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d

라는 문자열이 주어지고 xor 키는 1바이트라고 한다.

key가 1바이트이므로 0부터 255까지 반복문을 돌리며 xor 연산을 해서 말이 되는 문자열을 찾는다.
flag양식이 crypto{} 이기에 c가 되는 key를 찾아도 되지만 그냥 브포로 풀어줬다.

1
2
3
4
5
6
7
8
9
from Crypto.Util.number import *
s="73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d"

s2=bytes.fromhex(s)

for k in range(256):
    for ss in s2:
        print(chr(ss^k), end="")
    print()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sbi`dk h! O!%O}iOv$f eb!'#Ori'um
rchae~j!i !N $N|hNw%g!dc &"Nsh&tl
q`kbf}i"j#"M#'MkMt&d"g`#%!Mpk%wo
pajcg|h#k"#L"&L~jLu'e#fa"$ Lqj$vn
wfmd`{o$l%$K%!KymKr b$af%#'Kvm#qi
vgleazn%m$%J$ JxlJs!c%`g$"&Jwl"ph
udofbym&n'&I'#I{oIp"`&cd'!%Ito!sk
tengcxl'o&'H&"HznHq#a'be& $Hun rj
{jahlwc(`)(G)-GuaG~,n(mj)/+Gza/}e
zk`imvb)a()F(,Ft`F-o)lk(.*F{`.|d
yhcjnua*b+*E+/EwcE|.l*oh+-)Exc-g
xibkot`+c*+D*.DvbD}/m+ni*,(Dyb,~f
nelhsg,d-,C-)CqeCz(j,in-+/C~e+ya
~odmirf-e,-B,(BpdB{)k-ho,*.Bd*x`
}lgnjqe.f/.A/+AsgAx*h.kl/)-A|g){c
|mfokpd/g./@.*@rf@y+i/jm.(,@}f(zb
crypto{0x10_15_my_f4v0ur173_by7e}

이렇게 key는 16번째에서 나왔고 crypto{0x10_15_my_f4v0ur173_by7e}이다.

You either know, XOR you don’t

1
0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104

숫자가 주어지는데 xor key가 무엇인지는 안 알려준다.
우선 crypto{FLAG}의 형식을 가진 것을 알고 있기에

1
2
3
4
5
6
7
8
9
10
11
from Crypto.Util.number import *
s="0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104"

s2=bytes.fromhex(s)

s3="crypto{"

print(len(s2))

for i in range(len(s3)):
    print(chr(ord(s3[i])^s2[i]), end="")

의 코드를 실행하면 myXORke라는 값이 나온다.
이것으로 myXORkey를 유추할 수도 있지만 마지막이 “}”인 것도 알고 있기에 구해보면

1
print(chr(0x04^ord("}")))

의 결과는 y다.

그러므로 key=myXORkey로 잡고서 연산을 해주면

1
2
3
4
key="myXORkey"

for i in range(len(s2)):
    print(chr(ord(key[i%8])^s2[i]), end="")

FLAG가 나온다.
crypto{1f_y0u_Kn0w_En0uGH_y0u_Kn0w_1t_4ll}

Lemur XOR

lemur.png와 flag.png가 주어지고 두개를 XOR 연산하면 된다고 한다.
GPT의 도움을 받아서 작성했다.

pillow 이미지를 numpy 배열로 변환해서 RGB만 XOR 연산을 해서 사진을 얻었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# pip install pillow numpy
from PIL import Image
import numpy as np

A = Image.open("flag.png").convert("RGBA") 
B = Image.open("lemur.png").convert("RGBA")

a = np.array(A, dtype=np.uint8)  
b = np.array(B, dtype=np.uint8)

rgb = a[..., :3] ^ b[..., :3]
alpha = np.full((a.shape[0], a.shape[1], 1), 255, np.uint8)

out = np.concatenate([rgb, alpha], axis=2)
Image.fromarray(out, mode="RGBA").save("xor.png")

image crypto{X0Rly_n0t!}

This post is written by PRO.