리버스 엔지니어링
우리말로 역공학이라는 의미다. 공학이 과학적 원리, 지식, 도구를 활용해 새로운 제품, 도구를 만드는 것이라면, 리버스 엔지니어링은 만들어진 제품, 도구를 분해해서 분석하거나 재조합하는 것이다. 줄여서 '리버싱'이라고도 사용.
>다양한 목적으로 사용
*EAX: 함수의 리턴값을 저장하거나 산술 연산에 사용
*EBX: 특정 주소를 지정하기 위해 사용
*ECX: 반복적인 명령어 수행 시 횟수 저장에 사용
*EDX: 큰 수의 곱셈, 나눗셈 등의 연산시 EAX 레지스터와 함께 사용
*ESI: 문자열 복사, 비교 시 소스 문자열 주소 저장에사용
*EDI: 문자열 복사, 비교시 목적지 문자열 주소 저장에 사용
*ESP: 명령어 수행 시 스택의 위치 저장에 사용
*EBP: 함수 인자, 스택 변수에 접근하기 위해 사용
-세그먼트 레지스터
>메모리에 저장되어 있는 특정 세그먼트를 가리킴
*CS레지스터는 코드 세그먼트를, SS레지스터는 스택 세그먼트를, DS,ES,FS,GS는 데이터 세그먼트를 가리킴.
*EFLAGS레지스터(프로그램의 현재 상태, 분기문의 조건등을 검사하는 데 사용되는 플래그들을 모아놓은 레지스터)
*EIP 레지스터(CPU가 다음에 수행해야 할 명령어를 담은 메모리의 주소를 저장)
3.메모리 구조
-프로그램이 실행되면 각각의 세그먼트 단위로 묶어 메모리에 저장
1) 코드 세그먼트
-컴퓨터가 수생할 수 있는 명령어들이 저장되어 있는 메모리
>일반적인 프로그램에서 코드 세그먼트에 저장되어 있는 내용은 변경 x
>패킹, 가상머신 등이 적용된 프로그램에서 코드 세그먼트의 내용은 변경
*패킹:데이터를 팩(pack)하는 조작
*가상머신: 컴퓨팅 환경을 소프트웨어로 구현한 것, 즉 컴퓨터 를 에뮬레이션 하는 소프트웨어
2)스택 세그먼트
-현재 수행되고 있는 프로그램의 지역 변수와 함수 호출 인자를 저장하는 메모리 영역.
*스택의 현재 위치는 ESP레지스터가 가리키고 있으며, LIFO 구조를 가진다.
*올리디버거는 어셈블러의 반대 과정을 수행하는 디스어셈블러를 내장하고 있어 실행 파일의 기계어 코드를 어셈블리어로 표현해줌-> 사용자가 어셈블리어를 C언어로!!
6.바이트 오더
>컴퓨터에서 데이터가 바이트 단위로 메모리에 저장되는 순서
1) 빅 인디안 방식
큰 단위의 바이트가 앞에 옴
2)리틀 인디안 방식
작은 단위의 바이트가 앞에 옴
7. 디버깅
>컴퓨터 프로그램의 버그를 찾아서 제거하는 일련의 과정
올리디버거로 분석할 코드에 브레이크 포인트를 설정해 프로그램 실행을 중지 -> 레지스터, 메모리에 저장된 값을 살펴보며 재실행하거나, 코드를 단계적으로 실행하는 과정으로 디버깅 실행
올리디버거 영역