CHIqueen
UMDCTF SomeZips 본문
압축 풀기 문제다.
비밀번호는 압축한 파일중 가장큰 용량을 가진 파일이다.
이 파일들은 AES로 암호화 되어있기 때문에 내장 라이브러리인 zipfile로는 못풀고
pyzipper를 사용해야한다.
import pyzipper
import shutil
import os
import timeit
def getAns(testpw, largest, some_zip, flag):
global cycle
answer=''
status=0
for i in testpw:
if(flag==1 and i == largest):
continue
try:
some_zip.extract(largest, path='temp/', pwd=i.encode())
except RuntimeError:
#print("fail pw")
status = -1
continue
except EOFError:
#print("eoferror filename",i)
status = -2
continue
#no error
os.rename('temp/'+largest, 'temp/'+largest+'_'+str(cycle))
answer = 'temp/'+largest+'_'+str(cycle)
#print("find pw:", i, 'zip files count:' ,cycle+1)
status = 0
return status, answer
def main():
global cycle
start=timeit.default_timer()
answer = 'somezips.zip'
cycle = 0
#clean temp
if os.path.exists('temp/'):
shutil.rmtree('temp/')
#loop in temp
while(answer != ''):
try:
some_zip = pyzipper.AESZipFile(answer)
except:
#find real file copy to answer
print("find non zip answer", answer.split('/')[1])
#remove cycle underbar
tmp = answer.split('/')[1].split('_')
pureAnswer = ''
for i in tmp[:-1]:
pureAnswer += i
if not os.path.exists('answer/'):
os.mkdir('answer/')
if os.path.isfile('answer/'+pureAnswer):
print("answer file is already exist")
else:
shutil.copyfile(answer, 'answer/'+pureAnswer)
#print answer
stop=timeit.default_timer()
print('answer is',pureAnswer)
print('----reading answer file----')
f = open('answer/'+pureAnswer,'r')
print(f.readline())
f.close()
print('---------------------------')
print('execution time :', stop-start, 'seconds', 'unzip count:',cycle)
#clean
shutil.rmtree('temp/')
shutil.rmtree('answer/')
break
testpw=[j.filename for j in sorted([i for i in some_zip.infolist()], key = lambda x: x.compress_size)][-1:]
largest=testpw[0]
status, answer = getAns(testpw, largest, some_zip, 0)
if(status == 0):
#print('find',answer)
pass
elif(status == -1):
#if largefileName==pw fail do bruteforce other filename
testpw = some_zip.namelist()
status, answer = getAns(testpw, largest, some_zip, 1)
else:
print("error")
break
some_zip.close()
cycle += 1
if __name__=="__main__":
main()
code by tac
문제 풀다보면 아래의 에러가 미친듯이 나온다
1. 같은 이름파일
2. 압축크기가 큰게 비번인줄 알았으나 다른 비번
이를 flag값을 통해 처리를 했으며 아래와 같이 결과가 나온다.
UMDCTF-xkcd1319
혹시나 384번 손수 압축 푸신분은 존경합니다.
'포렌식 > CTF' 카테고리의 다른 글
UMDCTF Jarred-3 (0) | 2020.04.22 |
---|---|
UMDCTF Jarred-1 (0) | 2020.04.22 |
UMDCTF A Nation State Musical (0) | 2020.04.22 |
UMDCTF Sensitive (0) | 2020.04.22 |
Securinets Time Problems (0) | 2020.03.24 |
Comments