개요
* Easy_KeygenMe.exe 파일 실습
1. 레지스터 활용 분석
- 메모리 주소 및 스택 프레임의 이해
- ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리
2. 어셈블리 명령어 이해 및 알고리즘 분석
- Pseudo code 기반 소스코드 작성
목차
0. 파일 버전 확인(32bit, 64bit)
1. 정의된 데이터(db)
2. 어셈블리어: CMP, LEA, TEST, XOR, MOV, MOVZX, MOVSX
3. 메모리의 구조
1) 코드 영역
2) 데이터 영역
3) 힙 영역
4) 스택 영역 - 레지스터: ESP, EBP, EIP, ECX, EAX
4. IDA 메모리 주소 표시 차이
[Review] (3주차) 실습
2022.07.04 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe) (1)
0. 파일 버전 확인(32bit, 64bit)
실행파일 32bit, 64bit 버전 확인(e.g. exe, dll, ocx)
ExeProperties 프로그램: 윈도우 탐색기에 플러그인, 실행파일이나 프로그램 내부적으로 사용하는 라이브러리(dll, ocx 등)가 사용하는 비트 확인
설치 이후, 해당 파일 우클릭 > 속성(R) > Exe/Dll Info 탭 추가되어, Additional Exe/Dll Properties 확인 가능
Type: x86 (32-bit) or x64 (64-bit)
1. 정의된 데이터(db)
# define 식별자 문자열
- 식별자: 매개변수, 전달인자, ...
- 문자열: 치환텍스트
2. 어셈블리어: CMP, LEA, TEST, XOR, MOV, MOVZX, MOVSX
CMP
cmp [esp+68h+var_63], 61h: esp+68h+var_63의 값이 61h 위치에 있는 값과 같은지 비교(값을 빼서 비교)
LEA
lea edi, [esp+68h+var_63]: esp+68h+var_63에 저장된 주소를 esp에 저장
TEST
: 인수1과 인수2 내용을 AND 연산하여 결과가 0이면 ZF = 1로 설정(보통 NULL check할 때 사용)
(두 operand가 0이 아닌 경우를 제외하고는 값을 판별하기 어려움 → eax, eax와 같은 형태로 사용하여 0인지 아닌지 확인)
Byte 단위로 각각 스택에 넣어줌, 사용자가 입력한 문자열을 첫번째 글자부터 순서대로 Byte 단위로 레지스터에 넣음
XOR
두 입력 신호가 서로 같으면 0, 다르면 1, 동일한 두 값 → 초기화
MOV
데이터 복사 명령어
MOVZX
소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 0 padding
(목적지에 32bit register → 소스에 16bit register)
MOVSX
소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 소스의 맨 처음 bit로 채움
(목적지에 32bit register → 소스에 16bit register)
3. 메모리의 구조
1) 코드(code) 영역
const int constval = 30; // 상수
int function() { // 함수
return 20;
}
실행할 프로그램의 코드가 저장되는 영역 (= 텍스트 영역)
2) 데이터(data) 영역
int uniintial; // 초기화되지 않은 전역변수
int initial = 30; // 초기화된 전역변수
static int staticval = 70; // 정적변수
프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역
프로그램 시작 시 할당, 프로그램 종료 시 소멸
3) 힙(heap) 영역
int main(int argc, const char * argv[]) {
char *arr = malloc(sizeof(char) * 10); // 동적 할당 변수
return 0;
}
사용자가 직접 관리하는 메모리 영역
사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨
메모리의 낮은 주소에서 높은 주소로의 방향으로 할당
4) 스택(stack) 영역
int main(int argc, const char * argv[]) {
int localval1 = 30; // 지역변수 1
int localval2; // 지역변수 2
return 0;
}
지역 변수와 매개변수가 저장되는 영역(함수의 호출과 관련)
함수의 호출과 함께 할당, 함수의 호출이 완료되면 소멸
스택 영역에 저장되는 함수의 호출 정보: 스택 프레임(stack frame)
스택에 할당된 메모리 블록, 호출된 함수에 지정
함수가 호출되면,
1) 함수 호출자가 파라미터 형태로 정보를 넘겨줄 때 어딘가에 저장되고, 호출된 함수가 정보를 찾게 해야 한다.
2) 함수의 작업을 위한 임시 저장소가 필요하다.
* 스택: 제한적으로 접근할 수 있는 자료 구조(LIFO, Last In First Out)
* 임시 저장소: 주로 지역 변수가 사용, 함수가 종료되면 더 이상 접근 불가
전역변수가 저장되는 곳이 스택이라는 메모리 공간
먼저 선언된 변수일수록 높은 주소값을 할당 받음
→ ESP, EBP는 이러한 스택 공간의 주소값을 저장하기 위해 설계된 레지스터
레지스터: ESP, EBP, EIP, ECX, EAX
* E: Extended(16bit → 32bit system), 64bit에서는 R로 표현
ESP(Stack Pointer)
: 현재의 스택 지점(stack의 가장 아래 부분), 스택의 크기를 조정할 때 사용
- 현재 스택의 최상단 주소값(가장 작은값) 저장(∵ 스택의 주소는 높은 주소에서 낮은 주소로 할당)
- 스택에 값을 넣을 때마다 ESP가 4만큼 줄어듦
EBP(Base Pointer) (= Frame Pointer)
: 프레임 포인터를 사용하는 함수를 가리킴(함수가 프레임 포인터를 쓰는지 여부의 분석이 필요할 때, 이 속성을 이용해 수작업으로 지정 가능 - 레지스터의 크기 보정 필요)
- 현재 스택 프레임의 베이스 주소(스택의 가장 윗 부분)
- 스택 프레임(함수나 지역변수의 경계를 구분짓기 위한 하나의 블록으로 묶임)의 base 주소
- 스택 프레임 형태로 저장된 함수의 지역 변수나 전달인자를 참조/변경시 사용하는 레지스터
- 고정적, 코드 유지에 용이(스택프레임 생성시)
EIP(instruction pointer)
: 다음에 실행할 명령어 위치를 담는 레지스터
ECX(Extended Counter Register)
: 주로 반복 명령어 사용시 반복 카운터로 사용
EAX(Extended Accum ulator Register)
: 산술(덧셈, 곱셈, 나눗셈 등) 논리 연산을 수행할 때 사용, 함수의 반환값이 이 레지스터에 저장
4. IDA 메모리 주소 표시 차이
var_(숫자): 함수의 지역변수, EBP보다 더 낮은 메모리 주소에 위치하므로 음수 값을 가짐
스택 메모리 구조 상 지정된 주소는 초기 스택 포인터보다 낮은 주소에 있어야 하므로, 스택 포인터가 양수 값을 가지면 에러
디버거 | 메모리 주소 형태 | 비고 |
Ollydbg | ESP + n | 일반적인 형태 |
IDA Pro | ESP + 현재 스택 포인터 + var_? | 자동으로 스택의 사용을 조사해서 지역 변수를 찾아내는데 용이하도록 설정 |
IDA 디스어셈블러 화면 시작 부분의 var_? 형태로 특정 값이 설정되어 있음
함수 시작 시 EBP 주소를 기준으로 스택 상에 변수가 위치하는 오프셋 값
단축키
1) (지역 변수 선택 후) + x
해당 지역 변수가 또 다른 어디에서 참조되었는지 확인 가능
2) (지역 변수 선택 후) + Enter
"Stack of ..." 창 조회, 해당 함수에서 추측된 스택 프레임 보여줌
[Next] (5주차) 실습
2022.08.06 - [Security & Analysis/IDA Pro] - [IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)
'Security & Analysis > IDA Pro' 카테고리의 다른 글
[IDA Pro] chap.06 악성코드 정적분석 툴 사용법(Ransomware, reversing.kr) (0) | 2022.08.24 |
---|---|
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF) (0) | 2022.08.06 |
[IDA Pro] 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe) (0) | 2022.07.04 |
[IDA Pro] 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2) (0) | 2022.07.04 |
[IDA Pro] 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1) (0) | 2022.06.12 |