1. CPU가 사용하는 레지스터 종류(32비트)
레지스터 |
역할 |
EAX(Acuuulator) |
각종 연산에 쓰이며 가장 많이 쓰이는 변수 |
EBX(Base 레지스터) |
특정 주소 저장(주소 지정을 확대하기 위한 인덱스) |
ECX(Count 레지스터) |
반복적으로 실행되는 특정 명령에 사용됨 |
EDX(데이터 레지스터) |
일반 자료 저장 |
EBP(베이스 포인터) |
SS 레지스터와 함께 사용 되서 스택 내의 변수 값을 읽는데 사용됨 |
ESP(스택 포인터) |
SS 레지스터와 함께 사용 되서 스택의 가장 끝 주소를 가리킴 |
EIP(명령 포인터) |
다음 명령어의 오프셋을 저장하며 CS 레지스터와 합쳐져서 다음에 수행될 명령의 주소 형성 |
EDI(목적지 인덱스) |
목적지 주소에 대한 값 저장, 문자열이나 각종 반복데이터를 처리 또는 메모리를 옮기는 데 사용 |
ESI (출발지 인덱스) |
출발지 주소에 대한 값 저장, 문자열이나 각종 반복데이터를 처리 또는 메모리를 옮기는 데 사용 |
2. 올리디버거를 활용한 레나 1번 문제 간단 분석
[그림 1] 올리디버거 실행
올리디버거 실행 후 레나튜토리얼의 reverseMe 파일을 불러온다. 만약 올리디버거에 파일을 불러오게 되면 어셈블리어 형태로 나타난다.
[그림 2] 코드 분석 - 1
현재 시작 메모리 주소를 보면 00401000이며 PUSH에 0을 넣고 함수를 호출하고 있다. LoadIconA에 PUSH 4, PUSH EAX가 있는 것으로 보아 인자가 2개가 필요하다. 아래 LoadCusorA도 PUSH 7F00, 0이 있어 인자가 2개가 필요함을 파악할 수 있다.
[그림 3] 코드 분석 - 2
CreateFileA 함수는 총 7개의 인자가 필요하며 파일 생성 함수임을 알 수 있다. 또한 MessageBoxA 함수는 총 4개의 인자가 필요하며 메시지 박스 함수 임을 알 수 있고 ExitProcess는 모든 프로세스가 종료되는 함수다.
[그림 4] 코드 분석 - 3
프로그램 하단의 메모리 주소 덤프 값에서 주소, 아스키 값을 알 수 있다. 현재 프로그램이 실행되기 전의 스택 값을 확인해보면 0012FFC4다.
[그림 5] 코드 분석 - 4
F8을 눌러 코드를 실행하면 스택 주소 값은 0012FFC0으로 변환되고 EIP 값도 00401002로 변환되었음을 볼 수 있다.
[그림 6] 코드 분석 - 5
F8을 눌러 코드를 한번 더 실행하면 스택 주소 값은 0012FFC4로 다시 복귀되며 스택 값도 7C816037로 정리된다. 또한 00401007의 메모리 주소가 실행 됨에 따라 EAX로 전달되어 MZP라는 데이터를 반환하고 있다.
'악성코드분석' 카테고리의 다른 글
리버싱 기초 (3) (0) | 2021.01.11 |
---|---|
리버싱 기초 (2) (0) | 2021.01.11 |
UPX 자동 언패킹 (0) | 2021.01.05 |
MP3 컨버터를 이용한 Exploit (0) | 2018.01.21 |
ollydbg와 mona를 이용한 BOF 실습 (0) | 2018.01.21 |