본문 바로가기

리버싱/기초 지식

Study04 - 기초 지식(패킹, 언패킹) 많은 현대 프로그램들은 악성 행위로부터 자신을 보호하기 위해 실행 파일을 패킹하여 배포하곤 한다. 프로그램을 패킹, 또는 언패킹한다는 것은 무슨 뜻일까? 단순히 실행파일의 크기를 줄이기 위해 압축하는 컴프레싱(Compressing)과는 달리 패킹은 프로그램 분석을 어렵게 만들기 위한 목적을 가지고 있다. 이를 프로텍팅(Protecting)이라 하는데 프로그램이 분석되어 악의적으로 동작한다면 보안 사고를 초래할 수 있기 때문에 이 분석 자체를 어렵게하는 행위를 뜻한다. 이는 프로그램의 원본 실행 코드를 암호화하여 저장하고 이를 복호화하는 코드를 프로그램에 포함하는 방식으로 구현할 수 있다. 패커로 인해 패킹된 프로그램의 실행 코드는 실행 시점에 복호화되어 동작을 수행한다. 그렇기 때문에 패킹되지 않은 프로.. 더보기
Study03 - 기초 지식(IAT) IAT, Import Address Table은 실행 파일이 어떤 라이브러리의 어떤 함수를 가져다 쓰는지 기록해놓은 테이블이다. PE Loader가 PE 파일을 메모리로 로딩할 때 IAT에 기재된 API 이름을 참조하여 실제 주소를 찾아 IAT에 API를 가리키는 주소를 적어놓으면 코드에서 라이브러리를 참조할 때 이 주소를 사용하는 방식이다. 프로그램에 라이브러리를 포함하지 않는 DLL 방식을 사용하게 되면서 라이브러리를 프로그램 시작 시 로딩하고 종료 시 메모리에서 해제하는 Implicit Linking 방식과 프로그램 내부에서 사용되는 순간에 로딩하고 사용이 끝나면 해제하는 Explicit Linking 방식 두 가지로 구분되었는데 이 IAT는 전자의 방식에 사용된다. Import Address Ta.. 더보기
Study 02 - 기초 지식(Register, Call Stack, Prologue/Epilogue) Register 프로그램 내부의 명령어를 실행하는 것은 CPU의 제어장치와 레지스터로 이들이 프로그램을 실행하는 데 필요한 데이터는 레지스터에 있어야 한다. 그렇기 때문에 메모리의 데이터를 레지스터로 복사하는 과정이 필요하며 여러 프로그램이 하나의 CPU를 사용하려면 각 프로그램마다 사용하는 데이터가 다르기 때문에 레지스터의 내용을 바꿀 필요가 있다. 이 과정을 컨텍스트 스위칭(Context Switching)이라 하며 운영체제 수업에서 배웠듯이 빈도가 높을수록 성능 하락의 원인이 된다. 인텔 CPU의 레지스터 구조는 다음과 같다. 64-bit register Lower 32 bits Lower 16 bits Lower 8 bits rax eax ax al rbx ebx bx bl rcx ecx cx c.. 더보기
Study 01 - 기초 지식(PE) PE, Portable Executable Windows 운영체제에서 실행파일(exe)은 PE, Portable Executable 파일이라고 한다. 이런 PE 파일에는 PE 헤더에 이 프로그램을 실행하는 데 필요한 기본 정보와 파일의 데이터를 메모리 어디에 배치시킬 지 알려주는 파일 구성 정보가 담겨있다. PE 바디에는 프로그램이 사용할 코드, 데이터 등이 포함되어 있다. 이런 PE 형식 실행파일(exe, dll 등)을 실행시키면 운영체제의 로더(Loader)에서 이 PE 헤더의 정보를 분석, PE 바디의 코드와 데이터를 메모리의 코드 영역, 데이터 영역, 스택 영역, 힙 영역에 특성에 맞게 배치한다. 당연하지만 PE 파일은 PE 포맷에 맞게 만들어야 하며 이는 윈도우 기반 프로그램들이 지켜야 할 일종.. 더보기