728x90
반응형
개요
* 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)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe) (1)

개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com


0. 파일 버전 확인(32bit,  64bit)

실행파일 32bit, 64bit 버전 확인(e.g. exe, dll, ocx)

ExeProperties 프로그램: 윈도우 탐색기에 플러그인, 실행파일이나 프로그램 내부적으로 사용하는 라이브러리(dll, ocx 등)가 사용하는 비트 확인

Download ExeProperties

 

Download ExeProperties

<!--   ExtraBit Software Ltd. Products | Contact --> ExtraBit Software Home ExeProperties Download Download ExeProperties Download the ExeProperties installer for Windows 11/10/8/7 Download ExeProperties v1.4 To install ExeProperties on your system, run t

www.extrabit.com

설치 이후, 해당 파일 우클릭 > 속성(R) > Exe/Dll Info 탭 추가되어, Additional Exe/Dll Properties 확인 가능

Type: x86 (32-bit) or x64 (64-bit)

기본 속성(Alt+Enter)
Download ExeProperties v1.4
32-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)

 

[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

목차 1. Easy ELF 실습 - 실습을 위한 사전 단계(Linux 파일 실행) 2. 분기문 분석 3. byte 및 배열 정리 4. 소스코드 작성(어셈블리어 기반) [Review] (4주차) 이론 - 총정리 2022.07.19 - [Security & Analysis/..

sarahee.tistory.com

 

728x90
728x90

+ Recent posts