리버싱 - 기초 리버싱
리버싱 - 기초 리버싱
이미 예전에 공부했던적이 있기 때문에 가볍게 중요한 부분만 정리해보겠습니다.
1. 리버스 엔지니어링이란?
영어로 "Reverse Engineering"이라고 하며 한글로 해석해보면 역공학이라는 뜻을 가지고 있습니다.
역공학이라는 단어가 여러분야에서 사용되겠지만 우리가 배울 역공학은 소프트웨어의 구조, 기능, 동작 등을 분석하게 될 것 입니다.
2. 리버싱 방법?
2-1) 정적 분석
파일을 실행시키지 않고 겉모습을 관찰하여 분석하는 방법입니다.
정적 분석은 파일의 종류(EXE, DLL, DOC 등), 크기, PE, 문자열, 패킹 여부 등 내용을 확인하는 단계입니다.
※ 주의 : 디스어셈블러를 통한 어셈블코드 분석과 구조를 확인하는것도 정적 분석입니다.
2-2) 동적 분석
정적 분석과 달리 파일을 직접 실행시켜 행위를 분석하고, 디버깅을 통한 코드의 흐름과 메모리 상태 등을 확인하는 방법입니다.
파일의 변화, 레지스트리의 변화, 네트워크 등을 자세하게 확인하는 단계 입니다.
3. 많이 사용되는 디버거의 종류
3-1) OllyDBG - 올리디버거는 무료로 제공되며 Plugin도 많고 가볍고 빠르기 때문에 많은 리버서들이 사용합니다.
3-2) IDA Pro - IDA Pro는 코드의 흐름을 보기 쉽게 Graph View를 지원하며 플러그인 Hexray(강력한 디컴파일)를 지원합니다.
3-3) Immunity Debugger - 이뮤니티 디버거는 파이썬으로 제작된 스크립트가 지원이 되면서 강력합니다. 올리디버거랑 GUI가 비슷합니다.
3-4) x64 DBG - x64 DBG는 64비트 환경에서 잘 지원되도록 제작된 디버거입니다.
4. IA-32 Register
CPU 레지스터란?
CPU 내부에 존재하는 다목적 저장 공간입니다.
4-1) 범용 레지스터
EAX(Extended Accumulator Register)
사칙연산에서 변수와 같은 존재로 사용된다.
함수의 리턴값을 저장하기도 한다.
EBX(Extended Base Register)
ESI나 EDI와 결합하여 인덱스에 사용됨 주로 DS segment에 대한 포인터 저장
EAX, ECX EDX가 부족할때도 사용
ECX(Extended Counter Register)
반복 명령어 사용시 카운터로 사용됨(for문 while문 등에서 카운트 역활을 함)
EDX(Extended Data Register)
큰 수의 연산에서 EAX와 함께 사용하거나, 부호 확장 등에 사용된다.
함수의 리턴값을 저장하는 용도는 아니다.
ESI(Extended Source Index)
데이터를 복사하거나 조작시 Source Data의 주소를 저장한다. ESI 데이터 -> EDI 데이터
EDI(Extended Destination Index)
데이터를 복사할 때 Destination의 주소가 저장된다. 주로 ESI가 가르키는 데이터가 복사된다.
memcpy(void *dest, void *src, size_t count)
첫번째 인자 Destination(목적지), 두번째 인자 Source(시작지)
ESP(Extended Stack Pointer)
SS가 가르키는 Stack Segment의 맨 꼭대기 주소가 저장된다.
PUSH, POP 명령어에 따라서 4 Byte씩 변화한다.
EBP(Extended Base Pointer)
SS에서 현재 호출되어 있는 함수의 시작 지점의 주소가 저장된다.
현재 호출된 함수가 소멸되지 않는 한 EBP의 값은 변하지 않는다.
추가 레지스터로 FS경우 SEH, TEB, PEB 등 주소를 계산할때 사용됨
4-3) 프로그램 상태와 컨트롤 레지스터
EFlags(Flag Register)
블로그 참고 : http://no1rogue.blog.me/30095428920
4-3) Instruction Pointer
EIP(Instruction Pointer)
CPU가 처리할 명령어의 주소를 나타내는 레지스터