목차
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), 소프트웨어 개발에서 독립적인 컴파일을 가능하게 하는 프로그램
컴파일러가 만들어낸 하나 이상의 목적 파일을 가져와 단일 실행 프로그램으로 병합
다시 말해서, 프로그램이나 라이브러리 등 컴파일 이후 연결하는 과정
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)
'Security & Analysis > IDA Pro' 카테고리의 다른 글
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review) (0) | 2022.07.19 |
---|---|
[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 |
[Contents] IDA Pro Tutorial & Practical Malware Analysis (0) | 2022.05.18 |