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
반응형
'Wargame > Cryptohack' 카테고리의 다른 글
Extended GCD (0) | 2023.02.02 |
---|---|
Greatest Common Divisor (2) | 2023.02.01 |
Favourite byte (0) | 2023.01.31 |
XOR properties (0) | 2023.01.31 |
XOR Starter (0) | 2023.01.31 |