우선 같은 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를 가지는 파일이 추출된 결과이다.
의미가 있는 파일을 binwalk를 사용하여 추출한 결과이다.