22
Code Level Reversing 2009.11.03 ㈜ 안철수연구소 ASEC (AhnLab Security Emergency response Center) Anti-Virus Researcher, CISSP 장 영 준 주임 연구원

6. code level reversing

Embed Size (px)

DESCRIPTION

2009년 10월 서울여대 강연 자료

Citation preview

Page 1: 6. code level reversing

Code Level Reversing

2009.11.03

㈜ 안철수연구소

ASEC (AhnLab Security Emergency response Center)

Anti-Virus Researcher, CISSP

장 영 준 주임 연구원

Page 2: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

목 차

1. Code Level Reversing과 Assembly Basic

2. Debugging Basic

3. Disassembling Basic

Page 3: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

1. Code Level Reversing과 Assembly Basic

Page 4: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

1. Code Level Reversing과 Assembly Basic

1) Code Level Reversing

4

1) 프로그램의 설계 의도를 간파하거나 프로그램 바이너리에서 알고리즘을 파악하기위해 소프트웨어 개발, CPU, 운영체제 등에 대한 깊은 이해를 바탕으로 정보를 프로그램 제작 목적 및 방식을 파악하는 일련의 과정

2) Code Level Reversing은 분석 대상이 되는 파일을 실행하지 않는다는 의미에서 정적 분석 또는 Static Analysis 라고도 함

3) System Level Reversing과 비교하여 더 많은 분석 시간을 요구하나 프로그램의 상세한 기능들을 파악 할 수 있음

Page 5: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

1. Code Level Reversing과 Assembly Basic

5

2) Assembly Basic – 명령 형태

1) 어셈블리 언어는 기계어와 일대 일의 대응 관계를 가지며 어셈블리 언어 명령 하나가 기계어 명령 하나의 대응함

2) 어셈블리 언어는 일반적으로 IA-32 (인텔 32비트 아키텍처) 어셈블리 언어를 지칭하는 경우가 많음.

3) IA-32 명령의 기본적인 형태는 Opcode (Operation Code)와 하나 또는 2개의Operand로 구성

4) Opcode는 MOV와 같은 명령의 이름을 나타내고 Operand는 명령에 전달되는 인자(데이터)를 나타내며 어셈블리 언어에서는 3가지 형태로 존재

- 레지스터 이름 : 데이터를 읽거나 쓰기 위한 범용 레지스터 명칭 (EAX와 EBX 등)- 직접적인 데이터 : 코드 안에 포함되어 있는 상수 값- 메모리 주소 : Operand가 RAM에 존재 할 경우 메모리 주소로도 표기

명령 이름(Opcode) 목적지 Operand, 출발지 Operand

Page 6: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

1. Code Level Reversing과 Assembly Basic

2) Assembly Basic – 데이터 이동

6

1) 데이터 이동

- MOV 명령은 목적지와 출발지를 나타내는 2개의 Operand를 사용하여 단순히 출발지의 데이터를 목적지로 이동

- 목적지 Operand는 메모리 주소나 레지스터가 될 수 있음.

- 출발지 Operand는 직접적인 값, 레지스터, 메모리 주소 등이 될 수 있음

MOV 목적지 Operand, 출발지 Operand

메모리 주소레지스터

메모리 주소레지스터직접 값

Page 7: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

1. Code Level Reversing과 Assembly Basic

2) Assembly Basic – 산술 연산 (1)

1) 산술 연산

- 기본적인 산술 연산은 ADD, SUB, MUL, DIV, IMUL, IDIV라는 6개의 정수 연산 명령

ADD Operand 1, Operand 2

- ADD : 2개의 부호 있는 정수나 없는 정수를 더하여 Operand 1에 결과를 저장

SUB Operand 1, Operand 2

- SUB : Operand 1에서 Operand 2의 값을 배서 Operand 1에 결과를 저장

MUL Operand

- MUL : EAX의 값을 부호 없는 정수인 Operand로 곱하여 EDX:EAX에 64비트로 저장

7

Page 8: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

2) Assembly Basic – 산술 연산 (2)

1. Code Level Reversing과 Assembly Basic

DIV Operand

- DIV : EDX:EAX에 저장된 64비트 부호 없는 정수 값을 부호 없는 정수인 Operand로나누어 몫은 EAX에 저장하고 나머지는 EDX에 저장

IMUL Operand

- IMUL : EAX의 값을 부호 있는 정수인 Operand로 곱한 후 결과는 EDX:EAX에 저장

IDIV Operand

- IDIV : EDX:EAX에 저장된 64비트 부호 있는 정수 값을 부호 있는 정수인 Operand로나눈 후 몫은 EAX에 저장하고 나머지 값은 EDX에 저장

8

Page 9: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

1. Code Level Reversing과 Assembly Basic

2) Assembly Basic – 비교 연산과 조건 분기

1) 비교 연산

- CMP 명령은 비교 결과를 프로세스의 플래그에 기록

- 내부적으로 CMP 명령은 단순히 Operand 1에서 Operand 2를 뺀 것임

- 빼기 연산 결과를 반영하기 위해 적절한 플래그 값을 설정하고 빼기 연산 결과 값을 폐기

CMP Operand 1, Operand 2

2) 조건 분기

- JMP 명령 셋에 의해 이루어지며 특정 조건에 따라서 특정 주소로 실행을 분기

JMP 분기 주소 (레지스터, 메모리 주소)

9

Page 10: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

1. Code Level Reversing과 Assembly Basic

2) Assembly Basic – 함수 호출

1) 함수 호출

- CALL 명령은 함수를 호출하고 RET 명령은 함수 호출자에게 반환

- CALL 명령은 현재의 명령 포인터를 스택에 PUSH하고 특정 주소로 점프

- 함수가 수행을 완료하고 호출자에게 반환할 필요가 있을 때 사용하는 명령이 RET 명령임.

- RET 명령은 CALL 명령에 의해서 스택에 PUSH 되었던 명령 포인터 값을 POP 함.

CALL 함수 주소

10

Page 11: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

2. Debugging Basic

Page 12: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

2. Debugging Basic

1) Debugger

1) Debugger는 소프트웨어 개발자가 프로그램의 오류를 찾아내고 수정 할 수 있도록도와주기 위한 유틸리티

2) 대부분의 Debugger는 소스코드 없이 어셈블리 어언상에서 실행의 흐름을 따라갈수 있는 기능을 제공

3) Software Breakpoint는 프로그램 실행 시에 디버거가 프로그램 코드 사이에 명령을 삽입하는 방식삽입된 명령에 도달하면 프로세서는 프로그램 실행을 일시 정지하고 제어권을 디버거에게 넘김

4) Hardware Breakpoint는 CPU의 특별한 기능으로 어떤 특정 메모리 주소에 대한 접근이 이루어지면 프로세서가 프로그램 실행을 일시 정지하고 제어권을 디버거에게넘김

5) Debugger는 크게 User Mode Debugger와 Kernel Mode Debugger로 구분

12

Page 13: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

2. Debugging Basic

2) User Mode Debugger

1) User Mode Debugger는 일반적인 User Mode 어플리케이션을 디버깅하기 위해사용

2) User Mode Debugger는 디버깅 대상(Debuggee) 프로세스에 붙어 해당 프로세스에 대한 모든 제어를 수행할 수 있는 전통적인 어플리케이션

3) User Mode Debugger는 Kernel Mode Debugger와 달리 디버거 자체가 시스템상의 프로그램임으로 설치 및 사용이 간편

13

Page 14: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

3) User Mode Debugger 어플리케이션

2. Debugging Basic

1) OllyDbg는 리버싱을 위해서 설계된 디버깅 프로그램

2) WinDbg는 마이크로소프트에서 개발한 디버깅 프로그램 커맨드 라인 인터페이스제공

3) IDA Pro는 강력한 디스어셈블리어인 동시에 유저 모드 디버깅 프로그램

14

Page 15: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.15

2. Debugging Basic

4) Kernel Mode Debugger

1) Kernel Mode Debugger는 대상 시스템 전체를 제어 할 수 있으며 시스템에서 발생하는 어플리케이션 코드와 운영체제 코드 내부에서 발생하는 모든 것을 볼 수 있음

2) Kernel Mode Debugger는 운영체제에서 실행되는 하나의 어플리케이션이 아니라시스템의 커널과 동등한 컴포넌트로 존재하여 전체적인 시스템을 관찰하거나 실행을 중지 할 수 있음

Page 16: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

2. Debugging Basic

4) Kernel Mode Debugger 어플리케이션

1) SoftICE는 윈도우 디바이스 드라이버 개발 툴로 개발되어 로컬 커널 디버깅 수행

2) WinDBG는 커널 모드 디버깅이 가능하나 원격 커널 모드 디버깅 수행

16

Page 17: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

3. Disassembling Basic

Page 18: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.18

3. Disassembling Basic

1) Dissasembler

1) Dissasembler는 바이너리 기계 코드를 해석해서 사람이 읽을 수 있는 어셈블리 언어로 변환

2) Dissasembler는 코드의 각 명령을 해석해서 문자 형태로 표현할 뿐이며 바이너리자체를 실행 시키지는 않음

Page 19: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.19

3. Disassembling Basic

2) Dissasembler 어플리케이션

1) IDA Pro 가장 강력한 디스어셈블러이며 다양한 형태의 실행 파일 포맷을 지원함

2) 주요 기능으로 바이너리의 순서도로 디스어셈블된 코드의 논리적인 흐름을 그림으로 보여주어 코드 내부의 각 조건문이 함수의 실행 흐름에 어떠한 영향을 주는지 시각적인 이미지 제공

Page 20: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.20

3. Disassembling Basic

Page 21: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

* Reference

1) The Art of Virus Research and Defense

2) 리버싱 리버스 엔지니어링 비밀을 파헤치다

2) 리버스엔지니어링 역분석 구조와 원리

4) 어셈블리 언어 : 인텔 기반 컴퓨터를 위한

5) Intel 64 and IA-32 Architectures Software Developer's Manuals

21

Page 22: 6. code level reversing

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.22

Copyright (C) AhnLab, Inc. 1988-2009. All rights reserved.

AhnLab, the AhnLab logo, and V3 are trademarks or registered trademarks of AhnLab, Inc.,in Korea and certain other countries. All other trademarks mentioned in this document are the property of their respective owners.

AhnLabThe Joy of Care-Free Your Internet World