key="???????"
flag="cce2021{??????????????????????????????????}"
def encrypt(plain):
res=""
for _ in range(len(plain)):
res+=chr(ord(key[_%7])^ord(plain[_]))
return res
open("enc","wb").write(encrypt(flag).encode("base64"))
Bg0PXUlMTx46AgYKIRcWMR4HHCENDAMaAxwNCjoBBAomPRELCRgODQ1fGA==
이번 문제는 base64로 암호화되어있는 암호를 역연산하여 평문을 구하는 것이다. 처음에는 당연히 평문을 암호화해서 cce2021{} 안에 ???가 될 것이라고 생각하고 모든 경우의 수를 찾아서 플래그를 검색하려고 했었는데 지금 생각하면 왜 그랬는지 잘 모르겠다. 길이만 봐도 cce2021까지 포함해야 대략 45 글자 정도되서 4/3를 곱하면 60글자 정도로 암호화되는데 base64 암호를 확인하면 60글자 정도 된다. xor 암호화 코드를 보면 키값이 7이므로 7문자씩 잘라서 반복적으로 암호화를 한다. 따라서 앞에 7글자의 암호화된 문자열이 평문일 때는 cce2021이라고 가정하고 역연산을 진행하면 아래 코드로 계산할 수 있다.
import base64
hint="cce2021"
enc="Bg0PXUlMTx46AgYKIRcWMR4HHCENDAMaAxwNCjoBBAomPRELCRgODQ1fGA=="
enc2=base64.b64decode(enc)
print("[+] enc type: "+ str(type(enc2)))
for j in range(7):
for i in range(0x20,0x7F):
if(enc2[j]^i==ord(hint[j])):
print(chr(i),end='')
이제 key값이 enjoy~~라는 것을 알았으니 나머지도 계산하면 플래그를 획득할 수 있다.
'CTF > CCE 2021' 카테고리의 다른 글
[CCE 2021] 후기 (0) | 2021.09.26 |
---|---|
[CCE 2021] Search king (0) | 2021.09.26 |
[ CCE 2021] ptmd (0) | 2021.09.26 |
[CCE 2021] basic web (0) | 2021.09.26 |
댓글