ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소프트웨어 역공학 (리버싱, 어셈블리어) 2주차 정리
    여러가지 공부 2022. 4. 17. 22:29

    REVERSING 

    - 아키텍처: 시스템 구조와 동작 원리에 대한 지식

    - 기계어: 어셈블리 언어 (X86, X64, ARM, Erc)

    - 도구 활용 능력: 분석의 목적과 용도에 맞는 툴을 알고 다루는 능력

    - 개발: 프로그램 개발 능력

    - 경험: 다양한 패턴에 대한 지속적 분석

       - 악성코드 분석: 얼마나 빠르고 정확하게 악성코드를 파악하고 대응할 수 있는가?

       - 취약점 분석: 소프트웨어 취약점 발생 원인을 파악하고 개선방안을 찾아낼 수 있는가?

       - 버그 헌팅: 대상 소프트웨어를 얼마나 더 잘 이해하고, 이를 통해 제로데이를 도출할 수 있는가?

       - 보안 개발: 보안 결함을 최소화하는 프로그램을 개발하고 문제 상황에 대처할 수 있는가?

     

    CPU ARCHITECTURE

    CPU (중앙 처리 장치)

    - 프로그램의 명령어를 해석하며 데이터를 연산/처리하는 장치

    - CU: 입출력 장치 간 통신 및 조율, 명령어를 읽고 해석해 데이터 처리를 위한 순서를 결정 (스케줄링)

    - ALU: 산술 연산과 논리 연산을 계산하는 디지털 회로

    - MEMORY UNIT

         - RCGISTER: CPU의 연산에 사용하는 데이터를 기억하는 소규모 기억장치

         - CACHE: 메인 메모리에서 데이터를 불러들이는 시간을 단축하기 위한 임시 기억장치

     

    연산 유형

    - 전송: CPU 내의 레지스터와 메모리 사이에 데이터를 교환 (적재, 저장)

    - 처리:  ALU를 사용해 데이터를 조작 (논리, 변환)

    - 제어: CU의 제어장치가 프로그램의 실행 순서를 제어하는 연산 (반복, 조건, 호출)

    - 입출력: 레지스터와 외부 장치 사이의 데이터 이동을 수행

     

    CISC (복합 명령어 집합 구조)

    - 메모리 용량을 적게 차지하는 프로그램을 구성할 수 있도록 설계된 프로세서

    - 소규모 라인의 프로그램으로 많은 작업을 수행하기 위해 강력한 명령어를 명령어 집합에 포함

    - 가변 명령어 형식과 길이, 많은 명령어 종류, 복잡한 주소 지정 방식, 복잡한 회로 구성

    - 인텔 계열 프로세서

     

    RISC (축약 명령어 집합 구조)

    - 적은 수의 컴퓨터 명령어를 수행하도록 설계된 프로세서

    - 단순하지만 더 빨리 실행되는 소수의 명령어를 사용하는 아키텍처

    - 복잡하고 강력한 명령어 집합은 오히려 간단한 명령어의 해석과 실행 시간까지 증가시킴 (CISC)

    - 단순 명령어, 짧은 사이클 시간, 적재 및 저장 구조, 고정길이 명령어, 단순 명령어 형식, 제한된 종류의 주소 지정 방식

    - MIPS, ARM - lot 디바이스 스마트폰에서 사용

     

    MEMORY

    메인 메모리

    - 실행될 프로그램과 데이터가 잠시 머무는 장소

    - 직접 접근 저장매체 (DASD), 읽기 - 쓰기, 휘발성

    - 모든 프로그램이 실행되려면 반드시 메모리를 거쳐야 함

    - 체가 컴퓨터 속도: CPU 성능 + 메모리 성능 (용량)

    - 메모리를 장학하는 자. 모든 것을 쟁취 하리라!

     

    가상 기억장치의 필요성

    - 메인 메모리 용량 8GB. 게임 프로그램 용량 20GB - 게임 프로그램 전체를 메모리에 올릴 수 없다!

    - 메모리 관리 요구사항

        - 다수의 프로세스가 동시에 실행될 수 있는 주소 공간

        - 각 프로세스 고유의 메모리 자원 보호 방법

        - 필요시 프로세스 사이에 주소 공간 공유가 가능해야 함

        - 주소 공간을 프로그래머에게 투명하게 관리해야 함

     

    가상 기억 장치

    - 하드웨어와 소프트웨어를 사용해 구현한 메모리 관리 기술

    - 프로세스의 일부만 메모리에 적재하고 나머지는 보조기억장치에 둠

    - 프로그램이나 데이터를 페이지 도는 세그먼트 단위로 교환

    - 메모리 관리 및 보호 방식은 운영체제마다 다르게 정의

     

    운영체제 동작원리

    운영제체

    - 하드웨어 자원을 관리하고, 응용 서비스를 제공

    - 사용자와 하드웨어 사이의 인터페이스 역할

    - 하드웨어의 고장 탐색, 오류 처리, 보안 유지

     

    프로그램 동작 원리

    CHROME을 실행시키면?

    - CHROME.EXE 파일을 읽어 들인다

    - 새로운 프로세스가 생성된다

    - 프로그램 실행에 필요한 정보가 메모리에 올라온다

    - 프로세스 실행 순번을 기다린다.

    - 자기 차례가 되면 CPU로 들어가 실행된다

    - 나왔다가 들어갔다를 몇 번 반복한다

    - 동시에, 브라우저 화면을 띄워 달라고 운영체제에게 부탁한다

    - 운영체제는 크롬이 요청한 화면을 사용자의 모니터에 띄워준다

    - 추가로 필요한 요구사항이 있으면 이를 받아 처리해준다

     

    프로그램 제작 과정

    프로그램이란?

    - 문제 해결을 위한 방법과 순서의 집합

    - 문제 정의: 왜 하는 거지? 무엇을 만들어야 하는 건가?

    - 배포 형태: 공개용 또는 비 공개용, 사용자의 수준, 환경

    - 플랫폼과 언어: 사용목적, 구현해야 하는 기능, 가장 중요한 것 하나. 내가 할 줄 아는 언어

    - *알고리즘: 그냥 무식하게 손가락이 움직이는 대로 짤 것인가? 아니면 전략을 가지고 시작할 것 인가?

    - 코딩 시작: 계획 또는 프로세스에 따라, StackOverflow?!

    - 완성: 빌드 또는 저장

     

    빌드 

    - 소스코드 파일을 실행 가능한 독립 소프트웨어 형태로 가공하는 과정 또는 그 결과물

    - 전처리 -> 컴파일 -> 어셈블리 -> 링크 -> 로드

    - 편집을 하고, 조립을 한 다음 모든 조각을 연결시킨다

    - 전처리: 조건무 컴파일 명령어, 매크로, INCLUDE 파일 처리

    - 어셈블리: 어셈블리 소스 코드에서 어셈블리 목록을 추출 (오프셋 포함)

    - 링크: 컴파일의 마지막 단계로 오브젝트 파일과 라이브러리를 결합해 실행 파일 생성

    - 로드: 프로그램 실행 후 메모리 로드

     

    어셈블리 언어

    - 기계어와 일대일 대응하고 하드웨어 종속적인 저급(LOW-LEVEL) 언어

    - 컴퓨터 하드웨어가 이해할 수 있는 기계어를 연상 부호 형식으로 만든 언어 

    - 쉽게 말해서, 컴퓨터(CPU)와의 대화를 위한 대화 규칙_0010100110101010001010......

     

    BASIC INFORMATION

    숫자 표현

    - 10진수: 사람이 이해하는 숫자 - 1 더하기 1은 2

    - 16진수: 컴퓨터와 대화하기 위한 숫자 - 0X80380000

    - 2진수: 컴퓨터가 이해하는 숫자 - 10101111B

        - 1의 보수: 0은 1로, 1은 0으로 변경 (00000100 -> 11111011)

        - 2의 보수: 1의 보수에서 1을 더한 값 (11111011 -> 11111100)

     

    메모리 주소와 섹션

    - 모든 운영체제는 사용자 모드와 커널 모드로 메모리를 나누어 관리

    - 모든 프로그램은 사전에 약속된 형식을 따름

    - 사용자 영역

          - 코드 영역: 프로그램의 실제 코드가 올라오는 영역

          - 데이터 영역: 프로그램에서 사용하는 데이터가 올라오는 영역

     

    프로그램과 메모리

    - 프로세스: 메모리에 로드된 프로그램

    - 프로그램은 크게 코드, 데이터로 나누어 볼 수 있음

    - 프로그램에서 사용하는 코드와 데이터는 메모리에 고스란히 로드되고,

          - 코드 실행 흐름에 따라 변화하는 값들은 스택 또는 힙에 쌓이게 됨

    - 운영체제는 프로세스들의 독립적인 공간을 보장

    - 다른 프로세스의 영역을 함부로 접근하는 것을 막는 메커니즘이 존재

    - 프로세스와 메모리 관리는 운영체제의 몫!

     

    스택 (STACK)

    - 함수 호출 시 생성되는 지역변수와 매개변수가 저장되는 영역

    - 높은 주소에서 낮은 주소로 신장

    - LIFO 구조: 가장 처음에 들어간 데이터가 가장 나중에 나옴

     

    힙 (HEAP)

    - 동적으로 메모리 할당 시 사용하는 영역

    - 낮은 주소에서 높은 주소로 신장

     

     데이터 크기

    - 비트(BIT): 0 또는 1

    - 바이트(BYTE): 8bit

    - 워드(WORD): 16bit

    - 더블 워드(DWORD): 32bit (ARM 아키텍처에서는 워드)

    - 쿼드 워드(QWORD): 64bit (ARM 아키텍처에서는 더블 워드)

    - 키로 바이트(KB): 1024bit

    - 메가바이트(MB): 1024 KB

    - 기가바이트(GB): 1024 MB

Designed by Tistory.