Reverse Engineering에 대하여.. (Binary , Static Analysis vs Dynamic Analysis)

화승이·2022년 3월 23일
0

리버싱 공부

목록 보기
1/2
  • 배경

    컴퓨터의 언어 기계어 , 0 과 1로 이루어져 있음. (굉장히 비효율적)
    기계어를 번역하는 어셈블리어의 개발, 그 이후 C, C++, Go, Rust 등의 등장 (컴파일러 개발)

    • 고급 언어와, 저급 언어의 등장

프로그램

  • 프로그램이란? (바이너리Binary)
    연산 장치가 수행해야 하는 동작을 정의한 일종의 문서
    프로그램을 연산 장치에 전달 후 CPU가 적혀있는 명령들을 처리, 프로그래머가 의도한대로 수행
    • (과거)에니악 : 내부 저장장치 X , 사람이 전설을 연결하여 컴퓨터에 전달 or 천공 카드에 프로그램을 기록함.
    • (현재) 프로그램을 메모리에 저장 가능

컴파일러와 인터프리터

프로그래밍 언어 : 프로그램을 개발하기 위해 사용하는 언어

  • 소스 코드 (Source Code) : CPU 가 수행해야 할 명령들을 프로그래밍 언어로 작성한 것

  • 컴파일 (Compile) : 소스코드를 컴퓨터가 이해하도록 기계어의 형식으로 번역하는 것

  • 컴파일러 (Compiler) 컴파일을 해주는 소프트웨어

  • 인터프리팅, 인터프리터 : 컴파일러와 다르게 사용자의 입력, 작성한 스크립트를 그때 그때 번역하여 CPU 에 전달

  • 전처리 (Preprocessing)
    컴파일러가 소스 코드를 어셈블리어로 컴파일하기 전에, 필요한 형식으로 가공하는 과정
    (순서) 주석 제거 -> 매크로 치환 -> 파일 병합

  • 컴파일 (Compile)
    C로 작성된 소스 코드를 어셈블리어로 번역하는 것, 과정에서 문법적 오류가 있으면 컴파일을 멈추고 에러 출력

  • 어셈블 (Assemble)
    컴파일로 생성된 어셈블리어 코드를 ELF 형식의 목적 파일(Object file)로 변환하는 과정

  • 링크(Link)
    여러 목적 파일들을 연결하여 실행 가능한 바이너리로 만드는 과정

디스어셈블

디스어셈블이란?
컴파일된 프로그램의 코드는 기계어로 작성되어 있기에 이해하기가 어렵기 때문에, 이를 어셈블리어로 재번역한 과정

  • 디컴파일
    어셈블리어 보다 더 고급 언어로 바이너리를 번역하는 컴파일러

정적 분석과 동적 분석

정적 분석

프로그램을 실행시키지 않고 분석하는 방법
(ex. 자전거를 탈 때 타지 않고, 멀리서 자전거의 구조를 분석하는 방법으로 생각하면 됨. * 여기서 자전거 = 프로그램 )

1) 장점

  • 프로그램의 전체 구조를 파악하기 쉬움.
  • 분석 환경의 제약에서도 비교적 자유로움.
  • 바이러스와 같은 악성 프로그램의 위협으로부터 안전함. (애초에 프로그램을 실행시키지 않기 때문!)

2) 단점

  • 난독화(Obfuscation)가 적용되면 분석이 매우 어려워짐.

    난독화란?
    리버싱으로 보호하기 위한 방법으로 코드를 변형, 실행 흐름 변경하는 것

    • 다양한 동적요소를 고려하기 어려움.

동적 분석

프로그램을 실행시키면서 분석하는 방법
(ex. 자전거를 직접 타보면서 부품에 대한 이해를 높이는 방법)

1) 장점

  • 코드를 자세히 분석하지 않아도 프로그램의 개략적인 동작을 파악할 수 있다.

2) 단점

  • 분석 환경을 구축하기 어려울 수 있다.
    • 안티 디버깅(Anti Debugging) : 동적 분석의 일종인 디버깅을 방해하는 것
profile
이제부터 하고싶은것만 하면서 살거야

0개의 댓글