EYEN

펌웨어 파일 시스템 추출(2) 본문

대외활동 및 팀플/네뷸라 콘테스트

펌웨어 파일 시스템 추출(2)

EYEN 2024. 11. 6. 14:12

펌웨어에서 보통 binwalk를 통해 추출하는데, 이 경우 모든 파일이 추출되지 않는 경우가 꽤 있는 듯 하다.
1. 일단 binwalk로 펌웨어 추출

2. 310000.squashfs를 010 editor에 드래그드롭.

 
3. 오른쪽 아래 Variables에 compression 보면 value가 4인데 저게 xz라는 뜻이다.

4. xs compression 파일 시그니처는 FD 37 7A 58 5A 00이다. 'Find in Files'를 통해 해당 시그니처를 310000.squashfs에서 찾아보면

5. 이 부분을 추출한다.
31000.squashfs를 인자로 해당부분을 추출하는 코드를 적는다. 나같은 경우 팀장님이 정리하신 걸 복붙해서 썼다.

def extract_xz_segments(input_file, output_prefix):
    header = b"\xFD\x37\x7A\x58\x5A\x00"
    footer = b"\x00\x01\x59\x5A"

    with open(input_file, "rb") as f:
        data = f.read()

    start = 0
    segment_count = 0

    while True:
        start = data.find(header, start)
        if start == -1:
            break

        end = data.find(footer, start)
        if end == -1:
            print("No matching footer found for a segment starting at", start)
            break

        end += len(footer)

        segment = data[start:end]

        output_file = f"{output_prefix}_{segment_count:03}.xz"
        with open(output_file, "wb") as out_f:
            out_f.write(segment)

        print(f"Segment {segment_count} extracted to {output_file}")

        segment_count += 1
        start = end

    if segment_count == 0:
        print("No segments found.")
    else:
        print(f"Extraction complete. {segment_count} segments extracted.")

extract_xz_segments("310000.squashfs", "output_segment")

 
6. python3 extract_xz.py 결과

7. xz -d output_segment_*.xz 결과

 
8. file output_segment_* 결과