학사 나부랭이
CCE2021 Write up - rox 본문
암호화 동작 코드가 다 나와있는 문제예요.
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"))
암호화 소스 코드.py
Bg0PXUlMTx46AgYKIRcWMR4HHCENDAMaAxwNCjoBBAomPRELCRgODQ1fGA==
enc 파일 (암호문)
일단 구동 방식부터 보면
- enc 파일을 열어서,
- flag(cce2021{xxx})를 encrypt 함수로 암호화하고,
- 그걸 또 base64로 다시 암호화 한 후에,
- enc 파일에 쓰네요.
중요한 건 encrypt 함수인데 안을 보면
- _(이하 tmp)는 0에서 plain(flag) 문자열의 길이까지 1씩 증가
- key의 (tmp에 7로 나눈 나머지)번 째 문자를 ord 함수에 넣어서 숫자로 바꾸고('a' => 97)
- plain의 tmp번 째 문자도 숫자로 바꾸고
- 2와 3을 xor연산하고
- 4를 chr 함수로 문자화 한 뒤에 res에 붙이고
- plain 문자열이 끝나면 res를 리턴
이런 코드예요. 여기서 간단한 xor 설명!!!
입력 | 0011 (3) |
xor | 1011 (15) |
결과 | 1000 (8) |
2진수 기준으로 피연산자끼리 동일하면 0, 같지 않으면 1을 출력해요. 그리고 X ^ Y = Z일 때, X ^ Z = Y도 성립하죠.
그러니까
- '평문 ^ 키 = 암호문' 일 때,
- '평문 ^ 암호문 = 키' 로 키를 구하고
- '암호문 ^ 키 = 평문' 으로 평문을 구할 수 있죠.
#평문이 c, c, e, 2, 0, 2, 1, { 까지 알려져 있는데 키가 7글자라 다행이네요.
key="???????"
flag="cce2021{??????????????????????????????????}"
def encrypt(plain):
res=""
for _ in range(len(plain)):
res+=chr(ord(key[_%7])^ord(plain[_]))
return res
def test(text):
print(text)
tkey = ""
tplain = "cce2021"
#키 길이 만큼
for i in range(0, len):
#모든 아스키 코드(j)를 대입해서
for j in range(0, 126):
#j와 평문을 xor연산한 게 암호문과 일치하다면?
if(chr(j^ord(tplain[i]))==text[i]):
#j는 키문자 입니당
tkey += chr(j)
break
print(tkey)
return tkey
#먼저 base64로 디코드해줘요.
cry = open('enc', 'rb').readline().decode('base64')
#그리고 구해져있는 plain(cce2021)의 일부분과 암호문을 이용해 키를 구해요.
key = test(cry)
#마지막으로 암호화 함수를 그대로 재이용해서 복호화시켜요.
print(encrypt(cry))
'自習 > 입해킹' 카테고리의 다른 글
'For you bro' SCAM (0) | 2022.02.08 |
---|---|
CCE2021 Write up - ptmd (0) | 2021.09.27 |
WannaCryptor ~SMB vulnerability (0) | 2021.06.30 |
ANOM ~Operation Trojan Sheild (0) | 2021.06.26 |
Comments