본문 바로가기

2. Reversing (리버싱)

[2024.03.30] 리버씽씽카 3주차 활동

리버싱 스터디 3주차에는 유튜브 영상을 통해 리버싱 기초 지식을 학습했다.

8-10강을 듣고 내용을 정리한 후 어려웠던 부분을 공유하며 질문을 통해 해결하는 시간을 가졌다.

참고한 유튜브 영상:

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

 

리버싱 강의

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

www.youtube.com

 

8강 함수 호출 규약

 

함수 호출 규약(Calling Convention)이란?

함수를 호출할 때 매개변수(파라미터)를 어떤 식으로 전달하는가? 에 대한 일종의 약속

 

용어

○ Caller(호출자) : 함수를 호출한 애

○ Callee(피호출자) : 함수 호출 당한 애

 

함수 호출 규악은 크게 3가지로 분류할 수 있다.

1. Cdecl 호출

  • C언어에서 사용되는 방식
  • Caller 스택을 정리하는 특징이 있음

Visual Code에서 다음과 같은 C언어 코드를 작성한다.

 

x64dbg에서 main함수를 찾는다.

 

add 함수 내부에 cdecl이 있는 것을 확인할 수 있다.

 

2. Stdcall 호출

  • add 함수에서 정리함
  • Win32 API에서 사용됨 Callee

Visual Code에서 다음과 같은 C언어 코드를 작성한다.

 

x64dbg에서 main함수 찾는다. 코드를 Cdecl과 다르게 바꿨는데 x64dbg에서 나오는 결과가 같아 강의 내에서 실습이 중단되었다. ( --> 실행 시키지 않고 바로 x64dbg로 확인한 것이 이유이지 않을까? 라고 추측함)

 

3. fastcall 호출

  • Stdcall의 특징 모두 가짐
  • x64 매개변수 4개
  • ex) 최대 2개까지 ECX EDX RDX RCX로 이용하여 전달. 나머지는 스택으로 보냄
  • 장점 : Register 이용해서 호출이 더 빠름 = 프로그램 속도가 빨라짐

[정리]

Cdel는 Caller에서 스택 정리

: C언어에서 사용됨

 

Stdcall Callee에서 스택 정리

: Win32 API 사용

 

fastcall std 동일하지만

: 매개변수를 최대 2개까지 레지스터를 이용하여 전달하고 나머지는 스택으로 정리

: x64 아키텍처에서 사용됨

 

9강 PE file Format(양식, 체제)

 

PE 파일

  • windows OS 실행 가능한 파일을 의미
  • 32bit PE 용어 : PE file 32bit
  • 64bit PE 용어 : PE+ 또는 PE32+ (PE64 아님 주의)

PE file 종류

  실행 계열 : EXE, SCR

  드라이브 계열 : SYS, VXD

  Library 계열 : DLL, OCX, CPL, DRV

  Obj 계열 : OBJ (리버서한테는 관심이 필요없음)

  object : 파일은 실행이 애초에 절대 불가능

 

PE file 헤더 부분에는 수많은 정보가 있다.

구조체 형태, 즉 PE File Format을 공부하는 것은 PE Header 구조체를 공부한다는 것과 같다.

 

10강  DOS Header

 

 

VA & RVA

   VA : Virtual Address

  • 절대 주소 (고유한 경로)
  • 잘 쓰지 않음 (→ 변경할 수 없기 때문)

   RVA : Relative Virtual Address

  • 상대 주소
  • 현재 위치를 기준으로 파일의 상대적인 경로를 입력하는 방식
  • 현재위치 = 변수 = ImageBase

RVA + ImageBase = VA

ex) 어떤 PE 파일이 메모리에 로드되어야 하는데 특정 위치1에 가보니까 다른 파일이 있음

→ 다른 빈 공간을 찾아야한다 (= 재배치 Relocation)

재배치 : 상대 주소일 때만 가능함 (재배치가 발생했을 때 위치를 쉽게 옮길 수 있기 때문이다.)

 

DOS Header

MS-DOS (옛날 운영체제)

IMAGE_DOS_HEADER 구조체 : 모든 프로그램의 맨 앞에 있음

필수적으로 필요함!

 

   e_magic : DOS Signature (아스키 코드 값 MZ, 4D 5A), IMAGE_DOS_HEADER의 맨 앞부분

  e_ Ifanew : NT header 오프셋(= 떨어져있는 거리의 정) 표시 (NT header의 위치 나타냄)

 

ex) 4D 5A

      5A 4D (ZM)-리틀엔디언 저장방식으로 반대로 저장된다