우선 같은 CRC를 가지는 헤더를 확인하면서, EC헤더와 VID헤더로 같은 파일끼리 묶어보았다.

아래는 data_offset 크기로 파일을 읽어서 헤더를 묶은 후에 데이터를 추출하는 코드이다.

max_data_offset = 0x20000
target_fp = open("target_ubi.bin",'rb')
length = len(target_fp.read())

print (length)

def get_EC(data):
    EC = {}
    EC['magic'] = data[0x0:0x4]
    EC['data_offset'] = data[0x14:0x18].encode("hex")
    EC['crc'] = data[0x3c:0x40].encode("hex")

    return EC
    
def get_VID(data):
    VID = {}
    VID['magic'] = data[0x0:0x4]
    VID['crc'] = data[0x3c:0x40]

    return VID

CRC_list = []

for size in range(0, length, max_data_offset):
    target_fp.seek(size)
    chunk = target_fp.read(max_data_offset)
    EC_Header = get_EC(chunk[:0x40])
    VID_Header = get_VID(chunk[0x40:0x80])
    

    if EC_Header['magic'] != b"UBI#" and VID_Header['magic'] != b"UBI!":
        continue
    
    if EC_Header['crc'] not in CRC_list:
        CRC_list.append(EC_Header['crc'])

print(CRC_list)
	
for crc in CRC_list:
    result = open("./result/ubi"+crc,'wb')

    for size in range(0, length, max_data_offset):
    	target_fp.seek(size)
        chunk = target_fp.read(max_data_offset)
    
        EC_Header = get_EC(chunk[:0x40])
        VID_Header = get_VID(chunk[0x40:0x80])

        if EC_Header['magic'] != b"UBI#" and VID_Header['magic'] != b"UBI!":
            continue
        
        data_offset = int(EC_Header['data_offset'], 16)
        if EC_Header['crc'] == crc:
            result.write(chunk[data_offset:])

    result.close()

target_fp.close()

같은 crc를 가지는 파일이 추출된 결과이다.

Untitled

Untitled

의미가 있는 파일을 binwalk를 사용하여 추출한 결과이다.

Untitled

Untitled