본문 바로가기

해킹&보안/악성코드 및 치트

리버스 엔지니어링

리버싱에 대해 간단하게 짚고 넘어가보겠습니다.

리버스 엔지니어링(리버싱)의 사전적 정의

소프트웨어 공학의 한 분야로, 이미 만들어진 시스템을 역으로 추적하여 
처음의 문서나 설계기법 등의 자료를 얻어내는 일을 말한다.

 

크게게 5가지의 용어에 대한 개념을 파악해야합니다.

운영체제(OS) 시스템 H/W를 관리할 뿐 아니라 응용 S/W를 실행하기 위하여 H/W 추상화 플랫폼과 공통 시스템 서비스를 제공하는 시스템 S/W
파일시스템 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제를 가리키는 말
메인 메모리  메인 메모리는 램이라는 저장 장치로 구성, 컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역
실행 파일 실행 파일은 단순히 데이터만 담고 있는 파일과 달리 코드화된 명령에 따라 지시된 작업을 수행하도록 하는 컴퓨터 파일
프로세스 과정 또는 처리라는 뜻으로 사용되는 용어, 컴퓨터 분야에서는 '실행중인 프로그램'이라는 뜻으로 쓰임

 

윈도우 실행 파일은 MS에서 정한 규칙에 맞게 데이터가 채워져 있습니다.

PE파일 구조

PE Header  파일을 실행기키기 위해 필요한 정보가 기록되어 있는 영역
.text Section  파일이 동작하는데 필요한 코드가 기록되어 있는 영역
.data Section  코드가 실행될 때 필요한 부가적인 정보가 기록되어 있는 영역

PE Header에는 이 파일이 실행 파일이 맞는지, 실행될 떄 파일 데이터가 메모리의 어느 위치에 올라가야 하는지와 같은 정보가 기록됩니다

text섹션은 printf()를 사용해서 "안녕"이라는 문자열을 출력한다고 했을 때, printf() 함수가 text섹션에 기록 되어있게 됩니다. 

data섹션은 동일한 상황에서 "안녕"이라는 문자열 정보가 data섹션에 기록되어있습니다.

 

범용레지스터

EAX 곱셈, 나눗셈에서 사용되며 함수의 반환값을 저장
EBX ESI나 EDI와 결합해 인덱스에 사용
ECX 반복 명령어를 사용할 때 반복 카운터를 저장
ECX 레지스터에 반복할 횟수를 저장하고 반복 작업을 수행
EDX EAX와 같이 사용되며 부호 확장 명령 등에 활용
ESI 데이터 복사, 조작할 떄 소스 데이터 주소가 저장
EDI 복사 작업을 할 떄 목적지 주소가 저장, ESI레지스터가 가리키는 주소의 데이터가 복사
EBP 하나의 스택 프레임의 시작 주소 저장, 현재 사용한 스택 프레임이 사라지면 이전에 사용되던 스택 프레임을 가리킴
ESP 하나의 스택 프레임의 끝 지점 주소가 저장, PUSH, POP 명령어에 따라서 ESP의 값이 4바이트씩 변함
EIP 다음 실행할 명령어가 저장된 메모리 주소가 저장

 

레지스터 구성


스택

스택은 메모리의 한 부분으로, LIFO방식으로 동작하는 특별한 자료구조입니다.

스택은  POP, PUSH 두 가지 동작을 지원합니다. 프로그램은 이 두 개의 명령어를 가지고 스택을 제어하게 됩니다.

스택에는 한 방향으로만 데이터가 쌓이는데

PUSH를 하면 스택의 주소는 4바이트만큼 감소하면서 데이터가 스택으로 들어갑니다.

POP을 하면 스택으로부터 데이터가 꺼내지고 주소는 다시 4바이트만큼 증가하게 됩니다.

 

스택이 선계된 이유는 스택 구조 위에 있는 데이터가 시스템을 운영하는 데 있어서 중요한 역할을 하기 떄문입니다.

 

스택프레임

스택프레임은 서브루틴(함수)이 가지는 자신만의 스택 영역입니다.

스택프레임에서는 서브루틴 내부에서 사용하는 데이터가 저장되는데 함수가 호출될 때 스택 프레임이 생성됩니다.

함수가 동작을 종료하고 복귀 주소로 돌아갈 때 스택 프레임은 소멸하게 됩니다.

어셈블러 기본 구조

2개의 인자를 사용하는 명령어

어셈블리 명령어는 최대 3개까지 인자를 받아들일 수 있습니다. 예를 들어 보았습니다.

어셈블러 |  ADD   EAX   EBX (각각은 명령어, 인자1, 인자2) 

고급언어 |  EAX = EAX + EBX

핵사언어 |  01D8

쉽게 볼 수 있는 ADD를 살펴보겠습니다. 어셈블러쪽 명령어를 해석하면 EAX레지스터의 값에  EBX레지스터 값을 더해 EAX레지스터에 다시 저장하는 동작을 하게 됩니다.

 

1개의 인자를 사용하는 명령어

어셈블러 |  INC ESI (각각은 명령어, 인자1) 

고급언어 |  ESI = ESI + 1

핵사언어 |  46

명령어  'INC ESI'는 인자로 오는 ESI 레지스터 값을 1만큼 증가시키는 명령어입니다.

고급언어의 ESI = ESI + 1은 ESI++로 쓸 수도 있습니다.

 

더 많고, 깊은건 분석을 해보면서 알아가보도록 하겠습니다.

'해킹&보안 > 악성코드 및 치트' 카테고리의 다른 글

Reverse Engineering 7  (0) 2024.05.17
악성코드 분석 간단 개념  (1) 2024.05.17
악성코드 분석 1  (1) 2024.05.12
Reverse Engineering 7  (0) 2024.05.11
Reverse Engineering 6  (0) 2024.05.10