-
소프트웨어 역공학 (리버싱, 어셈블리어) 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
'여러가지 공부' 카테고리의 다른 글
소프트웨어 역공학 3주자 (0) 2022.04.18 도커와 쿠버네티스 비교 (0) 2022.04.18 기술적 취약점 분석 평가-방법 (수정필요) (0) 2022.04.17 개인 정보 보호 (0) 2022.04.17 악성코드 동적 분석, 정적 분석 (0) 2022.04.17