728x90
반응형
개요
* Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습
1. 디스어셈블리 상세 기능
- 스택 프레임 및 함수 호출 규약의 이해
- 동적 디버깅 사용 및 코드 실행
- 데이터 타입과 데이터 구조
- 기본 데이터/코드 변환
2. 스택/힙 할당 배열 및 구조체 접근

목차
0. Easy CrackMe 실습 이어서
1. 스택 프레임(stack frame)이란?
2. 레지스터: ESP, EBP, EIP, ECX, EAX
3. 어셈블리어: CMP, LEA, TEST
4. Debugger

[Review] (2주차) 실습 - Easy CrackMe (1)

2022.06.12 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

 

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

목차 - 샘플 파일을 이용하여 IDA Pro 실행 - 사용자 인터페이스 및 기본 사용법 이해 * 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요) 0. IDA Pro란? 1. 실행 파일 로드 2. 디스어셈..

sarahee.tistory.com


0. Easy CrackMe 실습 이어서

Easy_CrackMe.exe 실행시 팝업창
임의의 값을 넣어 확인 버튼 눌렀을 때 Incorrect Password
Alt + T: Enter the search substring(문자열 및 어셈블리어 검색) > Tab: Ctrl + T
MessageBoxA 함수 영역

  • 성공 시의 메시지 출력(Congratulation !!)
  • 실패 시의 메시지 출력(Incorrect Password)

input이 틀렸을 경우 MessageBox로 JMP하게 만드는 분기문 확인

.text:004010B0                 cmp     [esp+68h+var_63], 61h ; 'a'

.text:004010BD                 push    offset Str2     ; "5y"

.text:004010D1                 mov     esi, offset aR3versing ; "R3versing"

.text:0040110D                 cmp     [esp+68h+String], 45h ; 'E'

strcmp: 문자열 비교 함수

strncmp: strcmp + n(검사할 문자의 개수 지정)

형태: char * strncmp( const char *s1, const char *s2, size_t n);

ASCII Table(10진 - 16진 - 문자 변환): 97 - 0x61 - a, 69 - 0x45 - E
ASCII Table
Str2 = 5y, aR3versing = R3versing


1. 스택 프레임(stack frame)이란?

스택에 할당된 메모리 블록, 호출된 함수에 지정

함수가 호출되면,

1) 함수 호출자가 파라미터 형태로 정보를 넘겨줄 때 어딘가에 저장되고, 호출된 함수가 정보를 찾게 해야 한다.

2) 함수의 작업을 위한 임시 저장소가 필요하다.

* 스택: 제한적으로 접근할 수 있는 자료 구조(LIFO, Last In First Out)

* 임시 저장소: 주로 지역 변수가 사용, 함수가 종료되면 더 이상 접근 불가


2. 레지스터: ESP, EBP, EIP, ECX, EAX

예제

32비트 x86 기반 컴퓨터의 컴파일된 함수 코드

void bar(int j, int k); // 호출할 함수
void demo_stackframe(int a, int b, int c) {
	int x;
    char buffer[64];
    int y;
    int z;
    // 스택 프레임 테스트 용도 외에는 다른 목적이 없는 함수
    bar(z, y);
}

지역 변수에 최소 76바이트(3개의 4바이트 정수, 64바이트 버퍼)가 필요

변수 오프셋 ESP 기반 스택 프레임
z [esp] 지역 변수
y [esp+4]
buffer [esp+8]
x [esp+72]
저장된 eip [esp+76]  
a [esp+80] 파라미터
b [esp+84]
c [esp+88]

모든 오프셋은 ESP가 바뀜에 따라 다시 조절

변수 오프셋 EBP 기반 스택 프레임
z [ebp-76] 지역 변수
y [ebp-72]
buffer [ebp-68]
x [ebp-4]
저장된 ebp [ebp] 저장된 레지스터
저장된 eip [ebp+4]  
a [ebp+8] 파라미터
b [ebp+12]
c [ebp+16]

개념 정리

* E: Extended(16bit  32bit system), 64bit에서는 R로 표현

ESP(stack pointer register)

: 현재의 스택 지점(stack의 가장 아래 부분), 스택의 크기를 조정할 때 사용

- 스택에 값을 넣을 때마다 ESP가 4만큼 줄어듦

EBP(base pointer)

: 프레임 포인터를 사용하는 함수를 가리킴(함수가 프레임 포인터를 쓰는지 여부의 분석이 필요할 때, 이 속성을 이용해 수작업으로 지정 가능 - 레지스터의 크기 보정 필요)

- 스택의 가장 윗 부분, 스택 프레임 형태로 저장된 함수의 지역 변수나 전달인자를 참조/변경시 사용하는 레지스터

- 고정적, 코드 유지에 용이(스택프레임 생성시)

EIP(instruction pointer)

: 실행할 명령의 주소


3. 어셈블리어: CMP, LEA, TEST

1) .text:004010B0

.text:004010B0 cmp [esp+68h+var_63], 61h ; 'a'

디스어셈블리 코드 설명
.text:00401080  var_63 스택 프레임에서 바로 참조할 수 있는 모든 변수의 목록을
변수 크기와 프레임 포인터에서 떨어진 거리와 함께 요약해 보여줌
.text:00401080  sub esp, 64h 스택 프레임에 지역 변수를 위한 98바이트(64h 대략 환산) 할당
.text:004010B0  cmp [esp+68h+var_63], 61h dest == source 이면 ZF(Zero Flag) = 1, CF(Carry Flag) = 0

CMP

cmp [esp+68h+var_63], 61h: esp+68h+var_63의 값이 61h 위치에 있는 값과 같은지 비교(값을 빼서 비교)

LEA

lea edi, [esp+68h+var_63]: esp+68h+var_63에 저장된 주소를 esp에 저장

[esp+68h+var_63] 우클릭시 → [esp+5]

2) .text:004010BD

.text:004010BD push offset Str2 ; "5y"

ECX(Extended Counter Register)

: 주로 반복 명령어 사용시 반복 카운터로 사용

EAX(Extended Accum ulator Register)

: 산술(덧셈, 곱셈, 나눗셈 등) 논리 연산을 수행할 때 사용, 함수의 반환값이 이 레지스터에 저장

TEST

: 인수1과 인수2 내용을 AND 연산하여 결과가 0이면 ZF = 1로 설정(보통 NULL check할 때 사용)

(두 operand가 0이 아닌 경우를 제외하고는 값을 판별하기 어려움 eax, eax와 같은 형태로 사용하여 0인지 아닌지 확인)

[esp+6Ch+Str1] 우클릭시 → [esp+10]

3) .text:004010D1

.text:004010D1 mov esi, offset aR3versing ; "R3versing"
[esp+70h+var_60] 우클릭시 → [esp+16]

4) .text:0040110D

.text:0040110D cmp [esp+68h+String], 45h ; 'E'
[esp+68h+String] 우클릭시 → [esp+4]

주소 해당 문자열 ESP 스택 포인터 10진수 변환 순번
.text:004010B0 a [esp+68h+var_63] [esp+5] 2
.text:004010BD 5y [esp+6Ch+Str1] [esp+10] 3
.text:004010D1 R3versing [esp+70h+var_60] [esp+16] 4
.text:0040110D E [esp+68h+String] [esp+4] 1

참조 순서: E - a - 5y - R3versing


4. Debugger

options: No debugger / Local Bochs debugger / Local Windows debugger / PIN tracer

Remote GDB debugger / Remote Windows debugger / Trace replayer / Windbg debugger

어셈블리 코드 파악을 위한 Local Windows debugger

Start a new process in the debugger or continue a debugged process 클릭시 > Yes
answer: Ea5yR3versing

 


[Next] (4주차) 실습 - Easy KeygenMe

2022.07.04 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe)

 

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

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

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

개요

- 샘플 파일을 이용하여 IDA Pro 실행
- 사용자 인터페이스 및 기본 사용법 이해
* 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요)

목차
0. IDA Pro란?
1. 실행 파일 로드
2. 디스어셈블리 윈도우
3. 자주 쓰는 단축키
4. 추가 뷰 조회
5. Easy CrackMe 실습
6. IDA database 종료시 설정
7. 기타 분석 개념 정리

[Review] (1주차) 기본 이론

2022.05.22 - [IDA Pro] - IDA Pro 악성코드 정적 분석 툴 사용법(기본 개념 이론) - week.01

 

IDA Pro 악성코드 정적 분석 툴 사용법(기본 개념 이론) - week.01

목차 1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어 2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블 3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커 4. IDA, Hex-rays 개념 5. 세대별 언어 특징 1

sarahee.tistory.com


실습 진행 과정

1. IDA 파일 정보 확인
- IDA 로딩 파일(.idb), 데이터베이스 파일(.id0, .id1, .nam, .til)
2. IDA 툴 기능의 이해
- IDA 데스크탑/그래프 뷰 등 화면 동작/기능 파악
- 데이터 타입/코드 변환 등 설정 대화상자 기능 파악
- pseudo code 조회, 다른 함수로 변환 등
3. 코드 표기 이해(헥사 뷰, 디스어셈블리 뷰 동기화 등)

 


0. IDA Pro란?

Interactive Disassembler Professional, 핵스레이(Hex-Rays)사에서 배포한 디스어셈블러 도구

상호작용이 가능한 대화형으로 작성됐으며, 디스어셈블러 과정의 모든 부분을 수정, 조작, 재배치, 재정의 가능

- 악성코드 분석, 역공한 엔지니어링, 취약점 분석

분석하고자 하는 대상의 바이너리(파일)가 몇 비트 대상으로 컴파일 되었는지에 따라 결정 (32bit, 64bit)


1. 실행 파일 로드

IDA Pro는 파일 포맷과 프로세서 아키텍처를 인식

1) Load file

Portable executable for 80386 (PE) [pe.dll]: windows 운영체제에서 정의한 파일 포맷, 기본 윈도우 실행 파일로 인식

→ 운영체제 로더가 로딩하는 것처럼 메모리에 파일 매핑

MS-DOS executable (EXE) [dos.dll]: 확장 형태가 PE 파일

Binary file: IDA Pro가 파일을 원본(raw) 바이너리로 디스어셈블, 기본적으로 제공하는 파일 분석 방법

(IDA가 인식하지 못하는 경우 대비, 인식하는 로더가 없는 경우 저수준 분석 작업)

2) Processor type

MetaPC (disassemble all opcodes): 프로세스 모듈

- IDA 로더가 대부분 실행 파일 헤더 분석에 기초하여 알맞은 프로세스 선택

3) Options

Manual load: 파일을 로드하는 새로운 가상 주소를 명시하는 입력 박스를 볼 수 있음

Load file format Architecture
Portable executable for 80386 (PE) [pe.dll] x86 아키텍처, 32bit, RAM 4GB까지 가능(메모리 인식률)
Portable executable for AMD64 (PE) [pe64.dll] x64 아키텍처, 64bit

* PE 파일 포맷 기준

  • PE 파일(Portable Executable): 윈도우용 실행 파일 포맷
  • COFF(Common Object File Format): 유닉스용 공유 라이브러리 포맷
  • ELF(Executable Linking Format): 유닉스용 실행 파일 포맷

IDA 데이터베이스 파일 생성

1) id0: B 트리 형태의 데이터베이스

2) id1: 각 프로그램 바이트를 기술하는 플래그 데이터베이스

3) nam: 네임 창에서 이름 붙인 프로그램 위치의 인덱스 정보 데이터베이스

4) til: 해당 데이터베이스에서 정해준 지역 타입 정의 데이터베이스

* 각 파일의 포맷은 확인 불가(IDA 미제공)


2. 디스어셈블리 윈도우

(참고용) Optional Manual load 체크시 화면

디스어셈블리 윈도우는 두 모드 출력(Space bar로 전환) (그래프 모드 ↔ 텍스트(리스트) 모드)

1) 그래프 모드

플로우 차트 형식으로 단일 함수의 내역 조회, 행 번호/명령어 코드 배제

(면적을 최소한으로 줄이고자) 전반적으로 디스어셈블 코드 라인에 대한 정보가 많이 제외됨

초기 디스어셈블리 창(WinMain) - 바이너리를 조작하고 분석하는 주요 위치(어셈블리 코드 위치)

설정 변경

Options > General 팝업창(IDA Options) > Display disassembly line parts 에서

(1) Line prefixes (graph)

: 위치 찾기에 용이 (e.g. .text:0040131A)

(2) Number of opcode bytes (graph) = 6

: 기본 0으로 설정되어 있으며, 대부분의 명령어는 6바이트 이하이므로 6으로 변경 (e.g. 39 3D 64 85 40 00)

그래프 모드

화살표의 색깔과 방향을 이용하여 프로그램의 흐름을 파악할 수 있음

  • 녹색: 조건 점프(conditional jump)했을 경우(Yes)
  • 빨간색: 조건 점프가 아닐 경우(No)
  • 푸른색: 무조건 점프(unconditional jump)(연속 블록)

2) 텍스트 모드

바이너리 데이터 영역을 볼 때 사용

텍스트 모드

화살표 윈도우(arrows window): 출력 왼쪽, 프로그램의 비선형 흐름(nonlinear flow)를 보여줌

  • 실선: 무조건 점프
  • 점선: 조건 점프
  • (위를 향하는) 굵은 점선 화살표: 반복 구문 암시

 

IDA Pro의 자동 주석 기능

Options > General > ☑ Auto comments

  • sub link: 함수 시작 링크 (e.g. printf, sub_401080)
  • loc link: 목적지(location)로 점프하는 링크 (e.g. loc_401102, loc_4010FE)
  • offset link: 메모리 내의 오프셋 링크 (e.g. push offset Caption)

* offset link: 참조 위치로 점프해 출력할 때 유용, 메모리 내 정의한 위치로 이동

 

Compare Two Operands
Logical Compare
Logical Exclusive OR
Integer Subtraction with Borrow

...

앞으로/뒤로 가기 버튼

앞으로/뒤로 가기 버튼: 작업 내역 이동, 디스어셈블리 윈도우에서 새로운 위치를 탐색할 때마다 작업 내역에 추가

←: Esc / → : Ctrl + Enter

 

IDA Pro 인터페이스는 매우 다양해서, 원 위치로 되돌아오기 거의 불가능함

돌아오려면 Windows > Reset desktop 선택 (레이블 작업은 그대로, 윈도우와 GUI 인터페이스만 기본으로 복구)

저장하려면 Windows > Save desktop 선택

overview navigator, 탐색 밴드(navigation band)

로드한 바이너리 주소 영역을 코드에 따라 선형으로 보여줌

노란색 위치 화살표: 현재의 위치

하늘색: FLIRT로 인식한 라이브러리 코드 (COLLAPSED FUNCTION)

회색: 정의된 데이터

갈색: 정의되지 않은 데이터

분홍색: import, 외부 기호

빨간색: 컴파일러가 생성한 코드

파란색: 사용자가 작성한 코드(악성코드 분석 수행)

* IDA Pro는 FLIRT(Fast Library Identification and Recognition Technology)라 하여,

고속 라이브러리 식별과 인식 기술에 확장된 코드 시그니처를 포함하고 있음

→ 디스어셈블한 함수와 컴파일러가 추가된 라이브러리 코드를 식별해 label 가능


3. 자주 쓰는 단축키

Search > Next Code: 지정한 명령어를 담고 있는 다음 위치 커서로 이동

Search > Text: 전체 디스어셈블리 윈도우에서 특정 문자열 검색

Search > Sequence of Bytes: 특정 바이트 순서로 16진수 보기 윈도우에 있는 바이너리 검색 수행

G: Jump to address

G or Jump > Jump to File Offset 선택

특정 가상 주소로 점프 (e.g. 문자열, 셸코드, sub_401080, printf)

Ctrl + P: Choose function to jump to

Ctrl + P

특정 함수 조회 및 이동

F2: Break Point

F2

debbuging 모드의 break point

Pseudo Code

F5

IDA View에서 변환을 원하는 함수를 클릭한 뒤 F5 → 프로그래밍 변환되어 창 생성

특정 프로그래밍 언어의 문법이 아니라, 일반적인 언어로 코드를 흉내 내어 알고리즘을 써놓은 코드


4. 추가 뷰 조회

헥사 뷰(Hex View)

헥사 뷰(Hex View)

우클릭하여 Synchronize with > IDA View-A 확인

Edit 메뉴: 헥사 에디터 (수정 이후 commit이나 취소하여 view 모드로 돌아옴)

Data Format 메뉴로 표시되는 형식을 n진수 형태로 보여줌

구조체 창(Structures)

구조체 창(Structures)

바이너리에서 사용됐다고 판단된 C 구조체나 공용체 같은 복합 구조체를 보여줌

 

  • 열거 창(Enums): 구조체 창과 유사, IDA가 표준 열거형 데이터 타입을 찾았다면 표시
  • 임포트 창(Imports): 바이너리에서 분석된 임포트된 모든 함수 목록 조회(바이너리가 공유 라이브러리를 사용할 때만 유효함), 정적 링크된 바이너리는 외부 의존도가 없기 때문에 임포트될 사항이 없음
  • 익스포트 창(Exports): 파일의 진입점(entry point) 목록 조회
  • 문자열 창, 네임 창, 세그먼트 창, 시그니처 창, 타입 라이브러리 창, 함수 호출 창, Problems 창, ...

5. Easy CrackMe 실습

Easy_CrackMe.exe 실행시 팝업창
임의의 값을 넣어 확인 버튼 눌렀을 때 Incorrect Password
Quick view: Ctrl + 1 - Names view 선택

Ctrl + 1

Quick view 조회

Alt + T: Enter the search substring(문자열 및 어셈블리어 검색)

Alt + T

문자열 및 어셈블리어 검색

Ctrl + T

방금 팝업창에 조회된 문자열 검색(Tab 기능)

더블클릭하여 해당 함수로 이동

우클릭 > List cross references to... or Ctrl + X

xref, 커서가 가르키는 주소를 참조하는 곳을 조회

함수 확인
Text search 결과 (☑ Find all occurrences)
Alt + T > Congratulation
MessageBoxA 함수 영역

  • 성공 시의 메시지 출력(Congratulation !!)
  • 실패 시의 메시지 출력(Incorrect Password)

  • strcmp: 문자열 비교 함수
  • strncmp: strcmp + n(검사할 문자의 개수 지정)

input이 틀렸을 경우 MessageBox로 JMP하게 만드는 분기문 확인

[text:004010B5, 004010CD, 0040110B, 00401112]

'a' '5y' 'R3versing' 'E'

Ea5yR3versing


6. IDA database 종료시 설정

IDA 데이터베이스 닫기

데이터베이스가 닫혔던 상태 그대로의 환경에서 작업을 시작하게 해줌

IDB 파일 - IDA 데이터베이스 파일

현재 프로젝트 파일을 닫을 때 문제 없다면 압축되어 IDB 파일 생성 (기존 파일이 남아있다면 데이터베이스 손상)

- 가끔 크래시가 발생(e.g. IDA 버그, 설치 플러그인의 문제)


7. 기타 분석 개념 정리

0부 | 악성코드 분석 입문 (p.47~)

악성코드(malware)

일반적인 유형: 바이러스(virus), 트로이 목마(trojan horse), 웜(worm), 루트킷(rootkit), 스케어웨어(scareware), 스파이웨어(spyware)

목표: 네트워크 침입 대응에 필요한 정보를 알아내기 위함, 정확히 무슨 일이 발생했는가? 감염된 시스템과 파일이 무엇인까?

목적: 의심스러운 특정 바이너리가 하는 행위, 네트워크에서 탐지하는 방법, 피해 범위 측정

- 악성코드 분석을 통해 호스트 기반과 네트워크 기반의 시그니처 생성

* 네트워크 시그니처: 네트워크 트래픽 모니터링을 통해 악성 코드를 탐지할 때 사용

악성코드의 유형

1) 백도어(backdoor): 공격자의 접근 허용 목적으로 컴퓨터에 자기 자신을 설치하는 악성코드

2) 봇넷(botnet): 공격자가 시스템에 접속 가능, 동일한 봇넷에 감염된 모든 컴퓨터가 하나의 명령 제어(C&C, Command-and-Control) 서버로부터 동일한 명령어 수신

3) 다운로더(downloader): 다른 악성코드를 다운로드할 목적만으로 존재하는 악성코드

(1) 시스템에 처음 접근 권한을 얻으면 공격자는 다운로더를 설치

(2) 다운로더 프로그램은 추가 악성코드를 다운로드하고 설치

4) 정보 유출 악성코드(information-stealing malware): 피해자의 컴퓨터에서 정보를 수집해서 공격자에게 전송하는 악성코드

- 이메일이나 온라인 뱅킹 같은 온라인 거래에 접근 권한을 얻고자 할 때 사용

(e.g. 스니퍼, 패스워드 해시 수집기, 키로거)

5) 실행기(launcher): 다른 악성 프로그램을 실행할 때 사용하는 악성 프로그램

- 시스템의 상위 권한이나 은폐를 위해 다른 악성 프로그램을 실행할 때 이전 기법과 다른 기법을 사용

6) 루트킷(rootkit): 다른 코드 내에서 자신의 존재를 숨기도록 설계한 악성코드

- 백도어 같은 다른 악성코드를 함께 사용(공격자의 원격 접속 허용과 피해자의 코드 탐지를 어렵게 만들기 위함)

7) 스케어웨어(scareware): 감염된 사용자가 뭔가를 구매하게 겁을 주는 악성코드

8) 스팸 전송 악성코드(spam-sending malware): 사용자의 장비를 감염시켜 스팸을 전송하는 데 이용하는 악성코드

9) 웜/바이러스(worm/virus): 자기 자신을 복제해 추가로 컴퓨터를 감염

 

1부 | 기초 분석 (p.55~)

악성 여부를 판단하는 안티바이러스 도구 사용

악성코드를 판별하는 해시 사용

파일의 문자열, 함수, 헤더에서 개략적인 정보 수집

 

안티바이러스 스캐닝 - 해시:악성코드에 대한 지문 - 문자열 검색

안전한 해시 알고리즘 1(SHA-1, Secure Hash Algorithm)

메시지 다이제스트 알고리즘 5(MD5, Message-Digest Algorithm)

 


[Next] (3주차) 실습 - Easy CrackMe (2)

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

 

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

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

sarahee.tistory.com

 

728x90
728x90

+ Recent posts