본문 바로가기

카테고리 없음

어셈블리어(까먹는 개념 정리)

728x90

프로그램 : 작업을 수행하기 위해서 코드 및 데이터들이 포함되어 있는 실행 파일

프로세스 : 작업을 수행하기 위해서 메모리에 올라간 프로그램 단위 (ex : 일꾼 손)

프로세서 : 메모리에 올라간 프로세스를 처리하는 CPU(일꾼)

쓰레드 : 프로세스 처리 과정을 담당하는 프로세스 안에 작은 프로세스(일꾼 손가락)

 

실행파일(Exectuable File)

Windows - PE(Portable Executable)

Linux - ELF(Executable & Linkable Format)

Mac - Mach-O(Mach Object File Format)

 

PE 파일
 : Windows 에서 사용하는 실행 파일 형식이다.

 

다음과 같은 분석 작업 가능

  • 프로세스 처리 분석
  • API 호출을 위한 IAT 분석
  • 코드 크기 및 섹션 위치 분석
  • 패킹 및 언패킹 분석
  • 악성 코드 분석
ImageBase
 : PE 파일이 가상 메모리에 로드되는 가상 메모리 주소이며 이 영역은 PE 파일마다 예약된 범위가 있다.
RVA(Relative Virtual Address)
: PE 파일이 가상 메모리에 로드된 이후에 ImageBase 주소부터 시작한 상대 주소이다.
RVA 주소 값은 "VA-ImageBase" 주소값을 이용하여 구할 수 있다.

 

VA(Virtual Address)
: PE 파일이 가상 메모리에 로드된 이후에 0번지(0x00000000) 주소부터 시작한 절대 주소이다.
VA주소값은 "ImageBase 주소값 + RVA 주소값"을 이용하여 구할 수 있다.
ASLR(Address space layout randomization)
 : 프로그램이 메모리에 로드되는 Imagebase 주소를 랜덤으로 변경하여 메모리 관련 공격을 방지하는 기능이다.
API(Application Programming Interface)
: 운영체제, 프로그램 언어가 응용 프로그램에서 사용할 수 있도록 기능을 제공하는 인터페이스이다.
MSDN 문서 참조하면 함수의 매개변수, 인수값, 리턴값 기타 등등 내용을 상세하게 확인할 수 있다.
컴파일(Compile)
: 모든 헤더와 소스 코드 내용을 합쳐서 기계어 코드로 전환하여 실행 파일을 생성하는 작업을 의미한다.
DLL(Dynamic Linked Library)
: 프로그램들이 동시에 사용할 수 있는 코드, 데이터, 함수를 포함한 라이브러리이다. DLL 을 사용하면 메모리에 로드되는 중복된 코드와 리소스 사용을 최소화하고 다른 프로그램 성능을 향상시킬 수 있다.
윈도우에서 제공하는 DLL 파일은 대부분 "C:\Windows\System32" 디렉토리에 있으며 특정 프로그램들은 로컬 디렉토리에 해당 프로그램을 위한 DLL 파일을 사용하는 경우도 있다.

 

정적 링킹 & 동적 링킹

정적 링킹

 : 함수 코드를 프로그램에 포함시켜서 컴파일하는 방식(DLL 파일 필요 없음)

프로그램 크기는 증가

동적 링킹

: 프로그램이 실행될 때 함수를 불러오는 방식(라이브러리 DLL 파일 필요)

필요한 함수 정보만 포함시킴 크기가 증가되지 않음

DLL 파일을 로드시켜서 프로그램을 실행시킴

 

DLL 로드 방식( 암시적 링킹, 명시적 링킹 )

암시적 링킹
: 프로그램이 실행될 때 자동으로 DLL을 메모리에 로드하는 방식이다. 이렇게 진행하기 위해서는 컴파일을 진행할 때 "lib" 파일을 링크하여 프로그램이 사용하는 함수를 갖고 있는 DLL 정보를 포함시켜야 한다.
그렇기 때문에 PE 로더는 프로그램이 사용하는 함수 목록을 확인하여 DLL을 메모리에 로드해야 한다.
명시적 링킹
 : 프로그램이 실행된 이후에 필요한 DLL을 메모리에 로드하는 방식이다. 이렇게 동작하기 위해서는 다음과 같은 함수를 이용하여 DLL을 로드한 다음에 함수 주소를 획득하고 함수 사용이 끝난 이후에는 DLL을 메모리에서 언로드하여 해제해야 한다.

 

이때 필요한 함수 3개

  • LoadLibrary : 필요한 DLL을 프로세스 가상 메모리에 로드하는 함수
  • GetProcAddress : DLL에서 함수의 포인터 주소를 획득하는 함수
  • FreeLibrary : 프로세스 가상 메모리에서 DLL을 언로드하는 함수
    1. LoadLibrary 함수를 이용하여 프로세스 메모리 공간에 동적으로 DLL을 로드한다.
    2. 그리고 GetProcAddress 함수를 이용하여 DLL에서 함수 주소를 획득한다.
    3. 획득한 함수 주소를 가져와서 호출하고 사용 이후에는 FreeLibrary 함수를 이용하여 DLL을 언로드 한다.

 

암시적 링킹과 명시적 링킹 차이점

항목 암시적 링킹 명시적 링킹
로드되는 시점 프로그램이 실행될 때 프로그램 실행 중에 필요한 때
로드 방식 PE 로더에 의해서 자동 로드됨 LoadLibrary 함수에 의해서 로드됨
필요한 파일 *.lib DLL 파일
함수 호출 일반 함수처럼 호출 가능 GetProcAddress 함수에 의해서 호출
특징 프로그램 실행 시 모든 DLL 이 로드되기 때문에 DLL이 메모리에서 차지하는 비율이 높음 필요한 시점에만 DLL이 로드되기 때문에 DLL이 메모리에서 차지하는 비율이 낮음

 

 

 

 

 

참고

IT형님