인턴 기록

[인턴] 인턴 6일차 .tar 파일 해시 값 확인해서 변조 여부 확인하기

5353 2024. 9. 9. 15:13
반응형

 

배우는 입장이라 정확하지 않을수 있습니다. 댓글로 지적 해주세요. 확인하는대로 업데이트 할게요 :)

과제 요약 :

1.  임의의 xxxx.tar  sha256hash 값 구하기 

2. tar를 C:\Windows\Temp\proj에 풀기

3. 임의의 tar 파일에 4 Bytes String을 Header에 추가

4. 추가한 4 Bytes Header 를 제거하여 원본으로 만들기

과제

파일을 받을 때 , 해시랑 파일 같이 주는 데, 이 파일을 통째로 계산해서 해시 값을 계산한다. 서버에 등록된 해시 값과 내 것이 같으면 변조 되지 않고 정상적인 파일인 것이다.
서버에서 타르 파일 받아와서 tar파일을 Temp에 풀고, 디렉터리 만들어서 설치된 프로그램 파일 밑에 프로젝트 폴더에 덮어 쓰면 끝난다. 1일차에 했던 서버에서 파일 받기랑 연결되는 것이다.


과제 시작 전 준비

과제에 앞서 tar 압축을 위해 반디 집을 하나 설치 하자. https://kr.bandisoft.com/bandizip/

 

반디집 공식 홈페이지 · ALZ, EGG, 7Z, RAR 지원 무료 압축 프로그램

지원 포맷 7Z, ACE, AES, ALZ, ARJ, BH, BIN, BR, BZ, BZ2, CAB, Compound(MSI), DAA(1.0), DEB, EGG, GZ, IMG, ISO, ISZ, LHA, LZ, LZH, LZMA, PMA, RAR, RAR5, SFX(EXE), TAR, TBZ/TBZ2, TGZ, TLZ, TXZ, UDF, WIM, XPI, XZ, Z, ZIP, ZIPX, ZPAQ, PEA, UU, UUE, XXE, ASA

kr.bandisoft.com

 

먼저 원래 프로젝트에 git pull을 이용해 최신화 시켜준 뒤 C 드라이브에 임시 파일을 하나 생성 한다. 

임시 파일에 원래 프로젝트의 dist 폴더와 NSIS 폴더를 copy 해온다

copy C:\project\dist & C:\project\NSIS)

이후 이 임시 폴더에 있는 script로 NSIS 빌드 한 후에, 빌드 파일 실행 후에 레지스트리에 current_user 로 잘 변경되어있는지 확인(5일차 변경사항)  , 샘플 코드를 적용해서 레지스트리 Read/Write 로 환경 변수가 바뀌었는 지 확인(5일차 과정의 연장선) :regedit 에서 컴퓨터\HKEY_CURRENT_USER\ 확인

빌드 후  .exe 파일로 설치 해야함 -> 홈페이지로 이동 -> 다운로드 가능하게 됨


이제 임의로(아무거나 시험) 압축한 tar 파일을 하나 생성해서 해쉬 값을 가져와 보자.

방금 다운 받은 반디집에서 프로젝트 임의 부분을 .tar로 압축하자 

certutil -hashfile xxx.tar SHA256 (xxx 는 본인의 압축 파일이름)

에서  나온 해쉬 와 서버의 해쉬가 일치하면 문제가 없는 것이다. 해쉬를 계산, 출력하는 함수는 아래와 같다.

def sha256_hash(filepath):  # .tar의 해시 가져오기
    sha256 = hashlib.sha256()
    with open(filepath, "rb") as f:
        for block in iter(lambda: f.read(4096), b""):
            sha256.update(block)
    return sha256.hexdigest()

여기 까지 했으면 1.  임의의 xxxx.tar  sha256hash 값 구하기는 성공한 것이다.

이제 tar를 C:\Windows\Temp\proj( 각자의 개인 프로젝트 폴더에 ) 에 이동후 압축 풀기를 진행한다.

(이 과정은 쉬워서 캡쳐본은 찍지 않음)

이제 3,4 의 과정에서 임의의 tar 파일에 4 Bytes String을 Header에 추가, 제거 해보도록하자

같이 헤더 파일에 String 을 추가, 삭제하는 코드

def add_header_to_tar(input_tar, output_tar): #입력한 tar 파일에 4바이트 문자열을 헤더에 추가하고 새로운 파일로 저장.
    """
    :param 
    input_tar: 원본 tar 파일 경로
    output_tar: 헤더가 추가된 tar 파일 저장 경로
    """
    with open(input_tar, "rb") as original_file: #rb : 바이너리 모드 읽기
        original_data = original_file.read() 
    
    header = b'abcd'
    with open(output_tar, "wb") as new_file: #wb :바이너리 모드 쓰기
        new_file.write(header + original_data) 


def remove_header_from_tar(input_tar, output_tar): #4바이트 헤더를 제거하고 원본 tar 파일로 복원.
    """
    :param 
    input_tar: 헤더가 추가된 tar 파일 경로
    output_tar: 복원된 원본 tar 파일 저장 경로
    """
    with open(input_tar, "rb") as file_with_header:
        file_with_header.seek(4)  # 첫 4바이트('abcd')를 건너뜀
        original_data = file_with_header.read()
    
    with open(output_tar, "wb") as restored_file:
        restored_file.write(original_data)

위에서 파일 출력은 길고 올래 걸리므로 제거하고 dir 명령어로 확인하거나, type 명령어로 확인하는 것을 추천

(이미 실행했다면 Ctrl +c 로 탈출)

위에서 헤더 추가 함수를 먼저 실행 한뒤 type명령어로 확인해 보면 다음과 같이 출력됨을 알수 있다. 본인은 NANU string을 추가했기 때문에 파일 맨 앞에 String이 잘들어가 있다는 걸 눈으로 확인 할수 있다.

type명령어
  filename.txt 파일의 내용을 터미널에 출력

 

이제 dir 명령어를 이용해(macOs 는 ls -lh 를 이용하자) 파일이 실제로 4byte 늘었는 지 확인해 보자

늘어난 바이트 확인하기

800,873,472 -> 800,873,476 로 잘 늘어난 것을 확인할 수 있다.

 

tar 파일에 대해

tar 파일의 헤더는 아카이브된 각 파일과 디렉토리에 대한 메타데이터를 저장하는 역할, 파일의 이름이란던가, 크기, 유형 등등이 헤더에 나타남

앞서 수행한 tar 파일 헤더에 4바이트 문자열을 추가하는 것은 주로 파일을 특정 방식으로 처리하거나 구분하기 위한 메타데이터식별자로 사용되므로, 파일을 추적하거나 다른 파일들과 구별하기 위한 용도로 사용 가능함.  특히 내경우에는 파일에 추가된 헤더는 파일 무결성 검증을 위한 마커로 사용되는 듯함(아닐수도 있음) 예를 들어, 파일 전송 중 파일이 변조되었는지 확인하는 간단한 방법으로 헤더에 임의의 문자열을 추가하고, 이를 제거할 때 정확한 형식인지 체크

 

with 구문

여기서 추가로 방금 전 코드에서 with에 대해 설명하자면,  with는 파이썬에서 컨텍스트 관리자를 사용할 때 쓰이는 구문으로 , 파일을 열고 작업이 끝나면 닫는 작업을 자동으로 처리해주는 역할을 한다. 아래의 예시를 보면 코드를 더욱 간결하게 볼수 있다는 장점이 있다.

with open("file.txt", "r") as file:
    content = file.read()
# 파일 자동으로 닫힘, close() 호출 필요 없음

file = open("file.txt", "r")
content = file.read()
# 와 어떠한 작업 코드들...
file.close()  # 파일 닫기

 

반응형