어디 ctf였는지 기억이... 나중에 알아서 수정합니다.
encrypt문제는 golang(golang)으로 만들어졌고 flag파일을 읽어와 flag.encrypt파일을 생성한다.
ida로 열어보면 main_writeF, main_readF, main_main, main_encrypt가 있는데 main_encrypt에서 readF에서 읽어온 flag파일의 데이터를 가지고 연산을 한다.
encrypt함수에서 사용하는 파일 사이즈와 encryptkey
총 3단계로 이루어짐
1. data[i]=readdate[i-4]^readdate[i] (0~4는 연산x)
2. data[i]와data[i+4]위치 바꿈, 8개씩 끊어서
3. encryptkey와 data xor연산
def round1(data):
encryptkey="encryptk"
tmp=[]
for i in range(0,filesize):
tmp.append(ord(data[i])^ord(encryptkey[i%8]))
return tmp
def round2(data):
for k in range(0,filesize,8):
for i in range(4):
tmp=data[i+k]
data[i+k]=data[i+k+4]
data[i+k+4]=tmp
return data
def round3(data):
encrypted=data
for i in range(filesize-1,3,-1):
encrypted[i]=data[i]^data[i-4]
return encrypted
filesize=0x29e0
if __name__ =="__main__":
flagtest=open("flag.jpg","wb")
content=open("flag.encrypt","rb").read()
ret=round3(round2(round1(content)))
data=''.join(chr(char) for char in ret)
flagtest.write(data)
디크립트되어 생성된 파일을 열어보면 JFIF라고 처음에 적혀있는데 이건 jpeg라고 해서 jpg로 확장자를 바꿔주면 키값이 적혀있는걸 찾을 수 있다.
flag : g01ang_rev3rs1ng
'Write Up > CTF' 카테고리의 다른 글
Wandere bits write up (0) | 2018.01.29 |
---|---|
[Secuinside2017]snake (0) | 2018.01.14 |
[CODEGATE2017]HelloProtector (0) | 2018.01.07 |
[CODEGATE2017]RamG (0) | 2018.01.07 |
Defcon CTF 2017 Witchcraft (0) | 2017.07.08 |