Wargame/Cryptohack

You either know, XOR you don't

wyv3rn 2023. 2. 1. 13:14
728x90
반응형

1. intro

2. code 및 분석

2.1.  code

N/A

 

2.2. 분석

이제부터 시작인가보다.

힌트로는 역시 flag 형식을 생각해보라고 한다.

 

우선 해당 문자열을 byte 값으로 바꾸고, xor로 0부터 0xff까지 연산하면서 첫 문자가 c 일 때를 출력해보았다.

e = bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104')
d = ''

for i in range(0xff):
    for j in range(len(e)):
        d += chr(e[j] ^ i)
    if d[0] == 'c':
        print(hex(i), d)
    d = ''

 

┌──(kali㉿kali)-[~/Downloads]
└─$ python solve.py
0x6d cfLRKis%fKLJYCz0cjgQ6}SHKLJYCz0cjKY<xli

flag가 crypto{???} 의 형식이기에 알 수 있는 부분은

 

c = c
r = f
y = L
p = R
t = K
o = i

인데, 뭔가 이상하다.

왜냐하면 가장 마지막 값이 i 이기 때문에 이는 }가 되어야하는데, 앞에 동일한 i의 위치는 o 이기 때문이다.

 

다시 생각해보자.

첫 바이트와 모르는 값 x를 xor 하면 "c"가 나와야한다.

이를 공식으로 풀어보면

e[0] ^ x = "c"

가 된다.

이를 다시 한번 표현하면

e[0] ^ x ^ x = "c" ^ x

e[0] = "c" ^ x

e[0] ^ "c" = "c" ^ x ^ "c"

e[0] ^ "c" = x

가 된다.

이런식으로 계산하면 crypto{ 까지는 구할 수 있을 것 같다.

 

이걸 한번 해봤더니 아래와 같았다.

e = bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104')
ch = b'crypto{'
d = ''
i = 0

while i <= len(e) - 1:
    for j in range(len(ch)):
        d += chr(e[i]^ch[j])
        i += 1

print(d)

 

┌──(kali㉿kali)-[~/Downloads]
└─$ python solve.py
myXORke+y_Q
           HOMe$~seG8bGURNDFWg)a|TM!an

 

일단 myXORke 까지는 확실한데...

그 다음은 조금 애매하지만, myXORkey로 한번 질러보자.

 

3. exploit

e = bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104')
key = b'myXORkey'
d = ''
i = 0

while i < len(e):
    for j in range(len(key)):
        d += chr(e[i]^key[j])
        i += 1
        if i >= len(e):
            break
print(d)

 

┌──(kali㉿kali)-[~/Downloads]
└─$ python solve.py
crypto{1f_y0u_Kn0w_En0uGH_y0u_Kn0w_1t_4ll}
728x90
반응형