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