본문 바로가기

2. Reversing (리버싱)

[2024.05.11] 리버씽씽카 5주차 활동

이번 리버싱 스터디 5주차에는 14-15강을 듣고 내용을 정리한 후 어려웠던 부분을 공유하며 질문을 통해 해결하는 시간을 가졌다.

참고한 유튜브 영상:

https://www.youtube.com/playlist?list=PLY12b4RRLcSdsxgVvTW3mnNzMjVrd8JhO

 

리버싱 강의

리버싱에 대해 공부합시다.

www.youtube.com


<14강: Section Header>

Section Header란? 각 섹션의 속성을 정의한 것

  • code, data, rsrc 3가지 섹션으로 나눠어서 저장한다. (프로그램 복잡함 감소, 프로그램 안전성을 위해서)
  • ⇒ 각 섹션마다 특성의 권한이 주어진다.
    • code: 실행. 읽기 권한
    • data: 실행. 읽기 권한
    • rsrc: 실행. 읽기 권한 (resource의 약자)
  • IMAGE_SECTION_HEADER가 3개의 세션을 관리한다.
IMAGE_SECTION_HEADER {
	DWORD VirtualSize; #메모리에서 섹션이 차지하는 크기
	DWORD VirtualAddress; #메모리에서 섹션의 시작주소 (RVA=상대주소)
	DWORD SizeOfRawData; #파일에서 섹션이 차지하는 크기
	DWORD PointerToRawData; #파일에서 섹션의 시작주소
	DWORD Characteristics; #섹션의 속성을 (Bit OR)로 저장
	}

 

 

WORD Characteristics = 파일의 속성을 저장(Bit OR)

DWORD Characteristics = 섹션의 속성을 저장(Bit OR)

 

  • Virtual이 붙은 것은 메모리, 그 외는 파일에서 시작한다.
    • VirtualAddress(=SectionAlignment): 메모리에서 섹션의 시작 위치. 절대주소(VA) 아님 주의! 
    • PointerToRawData(=FileAlignment): 파일에서 섹션의 시작 위치

<15강: RVA to RAW>

  • RVA TO RAW: PE파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 오프셋을 매핑하는 것.
  • ex) char A[] = abcdef일때 c는 A시작점에서 2의 오프셋을 가진다.
  • 용어 정리
    • RAW(File Offset): 오차범위
    • 매핑: 하나의 값을 다른 값으로 대응시키는 것
  • 로딩: 매핑을 실제로 하는 것
  • 매핑 순서:
    1. RVA가 속해 있는 섹션 찾기
    2. 공식을 이용해서 파일 오프셋(RAW)을 계산한다.   
      • RAW = RVA - VA + PointerToRawData,
      • RAW - PointerToRawData = RVA - VA

 

연습)

1. RVA = 3000일 때 RAW는? (16진수 계산기 用)

큰 값 - 작은 값 = offset

작은 값 - 큰 값 = 오버플로우

 

3000 - 400 = 2C00, 3000 - 53200 = FFFF FFFF FFFA FE00 이므로 400보다는 크고, 53200보다는 작은걸 알 수 있다 => RVA는 Section (".text") 에 속한다.

 

PointerToRawData = 00000400, VA = 01001000 이므로, 3000 - 01001000 + 00000400 = FFFF FFFF FF00 2400

공식에 맞게 했지만 Image Base 를 고려하지 않아서 잘못된 결과가 나온다.

 

ImageBase = 01000000 이다. Offset과 VA의 시작주소는 다르기 때문에 맞춰주기 위해 VA - ImageBase 하여 1000이라는 값이 나온다.

(파일은 0000000으로 시작하는데 VA는 01000000으로 시작한다)

 

(공식) RAW = RVA - VA + PointerToRawData = 3000 - 1000 + 400 = 2400

 

2.  RVA = BC123일 때 RAW는?

RVA는 Section (".reloc")에 속한다. 

PointerToRawData = B9C00

VA = 010BC000

VA - ImageBase = BC000

 

(공식)RAW = BC123 - BC000 + B9C00 = B 9D23

 

3. RVA = ABA8 일 때, RAW는?

PointerToRawData = 400

VA = 1000 (ImageBase 뺀 )

(공식) RAW = ABA8 - 1000 + 400 = 9FA8

 

File Offset이 말도 안 되게 떨어져있는 경우, section data가 section rsrc로 매핑 된다는 뜻으로

RVA에 대한 RAW를 정의할 수 없다고 한다.