리버싱(Reversing)이란 Reverse와 Engineering의 합성어로 역공학이라는 뜻이다. 이것은 완성되어 있는 시스템을 역으로 추적하여 설계기법, 정보들을 분석하여 자료를 얻어내는 행위임! 이를 보안에 적용하면 시스템 구조를 파악하는 데 용이하여 취약점을 발견할 수 있고, 이를 통해 보안 혹은 해킹에 이용될 수 있다.
간단하게 이런 느낌이라고 보면 됩니다..... ㅎ
컴파일을 통해 프로그램 제작
[소스코드 작성 -> 어셈블리어로 변환 -> 바이너리 파일 생성]
리버싱
[바이너리 파일 생성 -> 어셈블리어로 변환 -> 소스코드 작성]
우선 CPU(Central Processing Unit)는 메모리로부터 명령어를 가져와서(fetch) 어떤 명령어인지 해석하고(decode) 실행하는(execute) 동작을 한다. 레지스터는 리버싱을 하기 위해서는 기본적으로 알아야 하는 지식이므로 꼭 알아야함!!!
- 범용 레지스터가 하는 몇가지의 역할이 있다. 작은 데이터의 임시저장 공간 역할, 연산처리 및 번지지정을 도와주며 컴퓨터의 장치들을 제어함
종류 | 용도 |
EAX | 산술(덧셈, 곱셈, 나눗셈 등) 논리연산을 수행하여 함수의 반환값이 저장 |
EDX | 큰 수의 곱셈과 나눗셈 연상에서 EAX 레지스터와 함께 사용이 되고 부호 확장 명령 등에 사용 |
ESI | 데이터를 조작하거나 복사 시 소스데이터의 주소가 저장 |
EDI | 복사 시 목적지의 주소가 저장 |
EBX | ESI 레지스터나 EDI 레지스터와 결합될 수 있으며 메모리 주소를 저장 |
ECX | 반복 명령어 사용 시 반복 카운터로 사용되는 값을 저장 |
ESP | 스템 프레임에서 스택의 가장 끝 지점 주소가 저장되며 Push, Pop 명령에 따라 값이 4바이트씩 이동 |
EBP | 스텍프레임에서 스택의 시작 지점 주소가 저장,되며, 스텍프레임이 소멸되지 않는 이상 EBP 레지스터의 값은 변하지 않음 |
[표 1] 범용 레지스터 종류
- 세그먼트 레지스터는 세그먼트라고 하는 메모리 영역에 대한 주소지정을 제공함
종류 | 용도 |
CS | 코드 세그먼트(명령코드가 작성되는 부분)의 시작주소를 포함. 이 세그먼트 주소에 명령어 포인터(IP) 레지스터의 오프셋 값을 더하면 실행하기 위한 메모리로부터 가져와야할 명령어 주소가 됨 |
SS | 메모리 상에 스택의 구현을 가능하게 함. 스택 세그먼트(스택에서 데이터를 처리하는 부분)의 시작주소를 포함 |
DS | 프로그램에서 정의된 데이터, 상수, 작업 영역을 포함. 데이터 세그먼트의 주소를 포함한다. |
ES | 데이터 수신측의 시작부분을 포함. 또한 스트링 명령에 보조적으로 사용됨 |
FS, GS | ES와 비슷한 역할로 여분의 세그먼트 레지스터 |
[표 2] 세그먼트 레지스터 종류
- 플래그 레지스터는 32비트의 크기를 가진다. 32비트 마다 의미를 갖고 있으며, 32비트 중 ZF, OF, CF는 조건 분기 명령어에서 동작 수행여부를 결정함
종류 | 용도 |
ZF(Zero Flag) | 산술 및 논리 연산의 결과가 0이 되면 ZF는 1(True)가 됨 |
OF(Overflow Flag) | 부호 있는 연산 결과가 용량보다 크면 OF는 1(True)가 됨 |
CF(Carry Flag) | 부호 있는 연산 결과가 용량보다 크면 CF는 1(True)가 됨 |
[표 3] 플래그 레지스터 종류
- 주소 레지스터는 CPU가 처리할 명령이 들어 있는 메모리 주소를 나타내는 레지스터임
종류 | 용도 |
EIP | 다음 실행할 명령이 들어있는 메모리의 주소를 가르킴 |
[표 4] 주소 레지스터 종류
- 메모리 구조를 살펴보자...
메모리 세그먼트 | 설명 |
Stack | 크기가 변하며, 지역 변수가 저장된다. 0xffff의 끝부분 부터 순서대로 지역 변수를 할당함 |
Heap | 스택과 마찬가지로 크기가 가변하며, 동적으로 할당된 데이터가 저장됨 |
BSS | 초기화 되지 않은 데이터가 저장됨 |
DATA | 전역변수(global), 정적변수(static), 배역(array), 구조체(structure)등이 저장됨 |
TEXT | 프로그램의 소스코드가 저장됨 |
[표 5] 메모리 구조
[그림 1] 메모리 구조
* 스택만 추가로 알아보는건 불공평하지만... 그래도 리버싱하면서 중요하므로 스택 프레임이란 것을 알아보자...
- 스택 프레임이란 함수가 호출 되었을 때 함수가 가지는 공간 구조이다. 함수가 동작을 종료하고 복귀할 때 스택 프레임은 소멸된다. ESP 레지스터는 스택 포인터 역할을 하며 EBP 레지스터는 베이스 포인터 역할을 한다. ESP 레지스터의 값은 프로그램 안에서 수시로 변경이 되기 때문에 스택에 저장된 변수나 파라미터에 접근할 때 ESP 값을 기준으로 잡으면 프로그램을 만들기 어려워진다. 그래서 생겨난게 스택 프레임!!!!
따라서 ESP 값을 EBP에 저장하여 유지해주면 ESP 값이 아무리 바뀌어도 EBP를 기준으로 해당 함수의 변수, 파리미터, 복귀주소에 접근이 가능하다...
[그림 2] 스택 프레임 구조
글 한개에 너무 많은 내용이 적혀 있으면 가뜩이나 지루한데 더 지루해지기 때문에 오늘은 여기까지...(핑계가 아닙니다!)
추가로 내일 바로 ㅎㅎ 이번주 어셈블리어에 대한 정리를 끝내고 다음주부터 레나 스타트 끊어 봅시다!!
신난다.. 재미난다...
더 게임 오버데스??? ㅎㅎ 핵노잼...
0x06 레나 튜토리얼 04 (0) | 2020.09.08 |
---|---|
0x04 - 레나튜토리얼 02(라이센스 키 알고리즘 분석하기) (0) | 2020.08.10 |
0x03 - 레나튜토리얼 01 (0) | 2020.08.09 |
0x02 - Reversing 의 서막...Part 2(어셈블리어) (1) | 2020.06.22 |
0x00 - Reversing (0) | 2020.05.31 |