관리 메뉴

CHIqueen

UMDCTF SomeZips 본문

포렌식/CTF

UMDCTF SomeZips

CHIqueen 2020. 4. 22. 19:07

압축 풀기 문제다.

비밀번호는 압축한 파일중 가장큰 용량을 가진 파일이다.

이 파일들은 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