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

1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어

기계어 - 어셈블리어 - 고급언어

1) 기계어(Machine Language)

개념: CPU가 별다른 해석(컴파일) 없이 읽을 수 있는 프로그래밍 언어(컴퓨터가 사용하는 언어), 프로그램을 나타내는 가장 낮은 단계

예시: 

1000 1011 0100 0101 1111 1000 -> 8b 45 f8

0000 0011 0100 0101 1111 1100 -> 03 45 fc

 

2) 어셈블리어(Assembly Language)

개념: 기계어의 숫자를 사람들이 이해하기 쉽게 만든 언어, CPU의 명령어들을 영어 약자로 표기(기호와 CPU의 명령어가 일대일 대응)

예시: 1000 1011 → MOV (저급 언어)

 

3) 고급 언어(High-Level Language)

개념: 사람들이 이해하기 편하도록 만들어진 프로그래밍 언어(사람의 언어에 가까운지를 표현하는 단어)

특징: 특정한 컴퓨터의 구조나 프로세서와 무관하게, 독립적으로 프로그램을 작성

비교: 프로그래밍 언어의 문법 구조가 기계어와 유사하면 '저급 언어(Low-Level Language)'

예시: 고급 언어(C++, Java, C#), 중급 언어(Middle-Level Language, C)

2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블

  • 어셈블러(assembler): 기호를 이진수로 변환하는 프로그램(어셈블리어 → 기계어)
  • 컴파일러(Compiler): 고급 언어로 작성된 명령어를 기계어로 변경하는 프로그램

어셈블러와 컴파일 작업을 역으로 수행하는 툴: 디스어셈블러와 디컴파일러

  • 디스어셈블러: 어셈블리 과정을 되돌려서 결과물로 어셈블 코드 생성(기계어 → 어셈블리어)
  • 디컴파일러: 어셈블리/기계어(입력) → 고급언어(출력)

전통적인 소프트웨어 개발 모델은 컴파일러, 어셈블러, 링커로 실행 파일을 만든다.

* 링킹(linking): 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드/실행 가능한 한 개의 파일로 만드는 작업

* 링커(linker): 링크 에디터(link editor), 소프트웨어 개발에서 독립적인 컴파일을 가능하게 하는 프로그램

 

컴파일러가 만들어낸 하나 이상의 목적 파일을 가져와 단일 실행 프로그램으로 병합

다시 말해서, 프로그램이나 라이브러리 등 컴파일 이후 연결하는 과정

 

Build Process(C): 전처리기 - 컴파일러 - 어셈블러 - 링커

3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커

gcc program.c
gcc program.c -o program

1) 전처리기(Preprocessor): 전처리기 구문 처리(디렉토리/컴파일러 라이브러리 폴더에서 헤더파일 include, define 값 치환)

gcc -E program.c -o program.i
include <stdio.h>
defind A 10

 

2) 컴파일러(Compiler): 고수준 언어를 저수준 언어(기계어와 가까운)로 나타나는 역할

gcc -S program.i -o program.s
.file   "program.c"
        .section        .rodata
.LC0:
        .string "%d + %d = %d\n"
        .text
        .globl  main
        .type   main, @function
main:

3) 어셈블러(Assembler): 완전히 기계어로 바꿔주는 역할

gcc -c program.s -o program.o
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@È^B^@^@^@^@^@^@^@^@^@^@@^@^@^@^@^@@^@^M^@
^@UH<89>åH<83>ì^PÇEü
^@^@^@ÇEø^T^@^@^@<8b>Eø<8b>Uü^AÐ<89>Eô<8b>Mô<8b>Uø<8b>Eü<89>Æ¿^@^@^@^@¸^@^@^@^@è^@^@^@^@ÉÃ%d + %d = %d

 

4) 링커(Linker): 여러 개의 오브젝트 파일 혹은 라이브러리를 합칠 때 사용

gcc program.o -o program.exe

5) 실행

./program.exe

4. IDA, Hex-rays 개념

IDA(Interactive Disassembler): malware reverse engineering tools

  • IDA Pro: 기본적으로 디스어셈블러(Dis-Assembler)의 속성을 가짐
  • Hex-rays: 디컴파일러(De-Compiler) 플러그인

디스어셈블리란?

disassembly: (명, n)분해, disassemble: (동, v)분해하다

 

디스어셈블리가 필요한 이유: 소스코드가 없을 때 프로그램을 이해하는데 주로 사용

1) 멀웨어 분석

동적 분석(dynamic analysis): 제어할 수 있는 환경하에서(샌드박스) 멀웨어를 실행시켜 가며 여러 가지 시스템 툴을 사용해 행동을 관측하는 것

정적 분석(static analysis): 프로그램 코드를 읽어가며 프로그램의 행동 분석

2) 취약점 분석: 취약점이 있는 프로그램의 소스를 알지 못할 경우 분석이 필요할 때

취약점 발견, 취약점 분석, 개발

프로그램의 잠재적 취약점 발견: 동적분석 퍼징(Fuzzing) 이용

* Fuzzing: 취약점 발견을 위한 기술, 대량의 고유한 입력 값 생성하고 어떤 것이 프로그램의 동작을 문제로 일으키는지 파악/분석/이용

3) 소프트웨어 상호 연동: 상호 연동이 필요한 프로그램의 소스를 알지 못할 경우 분석이 필요할 때

4) 컴파일러 검증: 컴파일러가 생성한 코드가 성능이 제대로 됐는지, 결과물이 제대로 됐는지 검증이 필요할 때

5) 디버깅 디스플레이: 디버깅 중 프로그램의 인스트럭션을 표시하고자 할 때


5. 세대별 언어 특징

1세대 언어

대표: 기계어로 비유됨

특징: 가장 저수준 형태로, 1과 0으로 구성. 16진수(hexa decimal)

2세대 언어

대표: 어셈블리 언어

특징: 니모닉(mnemonic)으로 인해 프로그래머가 연산을 기억하기 쉽게 변화함

* 니모닉: 짧으면서 특징 있는 문자열 (니모닉 코드: 연상 기호 코드, 기계어와 일대일로 대응하는 명령어)

* 어셈블러: 어셈블리 언어 프로그램을 실행 가능한 기계어로 바꿔주는 툴

3세대 언어

대표: fortran, cobol, C, JAVA

특징: 의미 단위로 블록을 묶음, 플랫폼(기계, H/W) 독립적인 형태로 작성

4세대 언어

대표: SQL, Visual C++, Visual Basic

특징: 비절차 언어(절차 언어의 대표는 C), 특정 응용 프로그램과 함께 지원(DB 접근에 이용되는 SQL 등)

5세대 언어

대표: Prolog(부족)

특징: 초고급언어, 인공지능 분야의 원리를 사용하는 시스템을 위해 개발된 언어(자연어 처리 등)

 


[Next] 2주차 실습(Easy CrackMe.exe)

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

 

728x90
728x90

+ Recent posts