WarGame/DigitalForensic with CTF

[DigitalForensic] with CTF 파일에서 이미지 파일을 찾아라!…

자료를 다운로드 받은면 다음과 같은 빈 사진을 얻을 수 있다.

사진을 HxD로 얻으면 다음과 같이 여러개의 사진이 합쳐져있음을 알 수 있다..

사진속에 숨겨진건 bmp, gif, png, jpg 4가지 종류이다. 시그니처와 푸터를 이용해서 다음의 코드로 추출했다.

def search_next(value:list) -> tuple :
    res = float('inf')
    for v in value:
        if(v==-1) :
            continue
        elif(v<res) :
            res=v
    return (res,value.index(res))

def search_bmp_next(value:list) -> tuple :
    res = value[3]
    new_value = value[:3]
    end,t = search_next(new_value)
    return (res,end,t)
        

if __name__=="__main__" :

    target_file = "MrFusion.gif"

    ext = [".jpg",".png",".gif",".bmp"]
    start = [b"\xff\xd8",b'\x89PNG',b'GIF89',b'\x42\x4D']
    end = [b"\xff\xd9",b'IEND\xaeB`\x82',b'\x00;']

    target_list = list()
    
    with open(target_file,"rb") as f:
        data = f.read()

    s_index=0
    cnt=1

    new_data = data
    
    while(True) :

        new_data = new_data[s_index:]
        
        tar_start = [-1]*len(ext)
        for i in range(len(start)) :
            tar_start[i] = new_data.find(start[i])
            
        if(max(tar_start)==-1) :
             break

        start_index,tar_type = search_next(tar_start)

        if(tar_type==3) :
            tmp_data=new_data
            
            tmp_start = [-1]*len(ext)
            for i in range(len(start)) :
                tmp_start[i] = tmp_data.find(start[i])
                    
            tmp_start_index,end_index,tmp_tar_type = search_bmp_next(tmp_start)
        else :
            end_index=new_data.find(end[tar_type])+len(end[tar_type])

        print(start_index,end_index)
        with open("./target/"+str(cnt)+ext[tar_type],"wb") as f:
            f.write(new_data[start_index:end_index]) 
            
        cnt+=1
        s_index=end_index
        
    print(str(cnt-1)+" extracted")

다만 중간에 5번째 gif가 시그니처를 2번만났는지 직접 추출했다. 

Key를 얻을 수 있었다.