버퍼 오버플로우란? 버퍼 오버플로우(Boffer Overflow)란 메모리를 다루는 데 오류가 발생해 잘못된 동작을 하는 프로그램 취약점입니다. 프로그램이 할당된 고정 길이(Fixed-length) 메모리 버퍼의 한계를 제대로 확인하지 않고 보유할 수 있는 것 보다 더 많은 데이터를 쓰는 경우 발생합니다. 이로 인해 인접 메모리 공간으로 넘지는 (Overflow)가 일어나 그 곳의 정보를 덮어쓰게 되고, 충돌이나 악용 가능한 상태를 유발합니다. 임의로 악성코드를 실행하는 가장 오래되고 흔한 공격 방법 중 하나입니다. 비교적 자유도가 높고, 프로그래머이 책임이 큰 C/C++ 언어는 다른 언어보다 이런한 오류가 발생할 가능성이 높습니다. 버퍼 오버플로우 공격(Buffer Overflow Attack)이란 길..
X86 Architecture x64 아키텍처는 인텔 64비트 CPU 아키텍처입니다. 흔히 컴퓨터를 16bit 컴퓨터, 32bit 컴퓨터, 64bit 컴퓨터라고 부릅니다. 이것 전체를 다시말해 N비트 아키텍처로 부르겠습니다. 여기서 64, 32 같은 것들은 CPU가 한 번에 처리할 수 있는 데이터의 크기를 말합니다. 이를 컴퓨터가 이해할 수 있는 데이터의 단위라는 의미에서 WORD(워드)라고 부릅니다. WORD가 크면 어떤 점이 유리할까요? WORD가 크면 사용할 수 있는 가상메모리의 크기가 커지기 때문에 최근에는 64bit 컴퓨터를 주로 사용합니다. 32비트 아키텍처에서는 4기가 바이트가 최대로 가능한 가상메로리의 크기로 많은 메모리 자원을 소모하는 전문 소프트웨어나 고사양 게임 등을 할 때 부족할 수..
자유 소프트웨어 재단 리처드 스톨만이 자유 소프트웨어의 생산과 보급을 장려하기 위해 창립한 재단 자유 소프트웨어 목적에 상관없이 프로그램을 실행시킬 수 있는 자유 필요에 따라서 프로그램을 개작할 수 있는 자유(이러한 자유가 실제로 보장되기 위해서는 소스 코드를 이용할 수 있어야만 한다. 왜냐하면 소스 코드 없이 프로그램을 개작한다는 것은 매우 어려운 일이기 때문이다.) 무료 또는 유료로 프로그램을 재배포할 수 있는 자유 개작된 프로그램의 이익을 공동체 전체가 얻을 수 있도록 이를 배포할 수 있는 자유 // free의 뜻은 무료가 아닌 자유를 뜻함 GNU(GNU is Not Unix) Project GNU는 운영 체제의 하나이자 컴퓨터 소프트웨어의 모음집 GNU는 온전히 자유 소프트웨어로 이루어졌으며, 그..
DLL이란? DLL은 Dynamic Link Libray의 약자로 동적 링크 라이브러리라고 불립니다. 여러 프로그램에서 동시에 사용할 수 있는 코드와 데이터를 포함하는 라이브러리입니다. DLL을 사용하면 프로그램을 여러 개별 구성 요소로 모듈화할 수 있습니다. 또한 프로그램의 다른 부분에 영향을 주지 않고 각 모듈의 업데이트를 손쉽게 할 수 있습니다. DLL의 이점 더 적은 리소스 사용 여러 프로그램이 같은 함수 라이브러리를 사용하는 경우에 DLL을 사용하면 실제 메모리에서 로드되는 중복 코드를 줄일 수 있어 Windows 운영체제의 다른 프로그램의 성능이 크게 향상될 수 있습니다. 모듈식 아키텍처 활용 DLL을 사용하면 모듈식 프로그램을 효율적으로 개발할 수 있습니다. 여러 언어 버전이 필요한 큰 프로..
어셈플리 헨드레이란? 어셈블리 핸드레이는 어셈블리어를 C언어로 복원하는 작업을 의미합니다. 때문에 어셈블리어와 함수의 프롤로그, 에필로그를 미리 알고 있어야 합니다. 어셈블리어 2023.03.13 - [Security/System] - [003] x86 아키텍처의 어셈블리어 명령어 [003] x86 아키텍처의 어셈블리어 명령어 어셈블리어란 무엇일까요? 먼저 고급 언어와 저급 언어부터 짚고 넘어가겠습니다. 고급 언어는 간단히 말해 인간이 이해하기 쉬운 언어입니다. Python, C, C++, JAVA, Javascript 등이 있습니다. 일반적 movefun-tech.tistory.com 함수의 플롤로그와 에필로그 2023.03.13 - [Security/System] - [005] 함수의 프롤로그(pro..
개념 프롤로그(Prologue)와 에필로그(Epilogue)는 무엇일까요. 프롤로그는 보통 문학 작품에서 본편을 시작하기 전에 먼저 읽도록 하는 파트입니다. 에필로그는 작품의 줄거리가 끝난 후 보충된 부분을 말합니다. 함수의 프롤로그(function prologue)와 에필로그(function epilogue)도 마찬가지입니다. 함수의 프롤로그는 함수 시작 부분의 몇 줄의 코드입니다. 스택과 레지스터를 함수 내에서 사용할 수 있습니다. 함수의 에필로그는 함수의 끝에 나타나며, 스택과 레지스터를 함수가 호출되기 전의 상태로 복원합니다.이는 어셈블리 언어 자체의 일부가 아닌 사용하는 규칙을 나타냅니다. 컴파일 결과 확인 아래 C언어 예제를 바탕으로 x86-64 gcc 4.5.3 컴파일러로 컴파일해보겠습니다...
컴퓨터 저장장치의 종류 컴퓨터 저장장치는 어떤 것이 있을까요? 우선 저장장치의 계층을 살펴보겠습니다. 보조기억장치는 프로그램이나 데이터 등을 비교적 장기간 저장하기 위한 저장장치입니다. 용량이 크고 가격이 저렴하지만, 속도가 느리다는 단점이 있습니다. 하드디스크(HDD)와 솔리드 스테이트 디스크(SSD)가 있습니다. 주기억장치는 CPU가 연산을 수행하기 위해 필요한 명령어나 데이터를 임시로 저장하기 위한 기억장치입니다. 보조기억장치보다 속도가 빠르지만, 가격 대비 용량이 적습니다. 캐시메모리는 전원이 켜져있으면 데이터가 계속 유지됩니다. CPU와 직접 통신하는 메모리의 한 종류로 속도가 매우 빠르다는 장점이 있습니다. 레지스터는 CPU가 연산에 필요한 자료를 임시로 저장하는 역할을 합니다. 컴퓨터 동작 ..
어셈블리어란 무엇일까요? 먼저 고급 언어와 저급 언어부터 짚고 넘어가겠습니다. 고급 언어는 간단히 말해 인간이 이해하기 쉬운 언어입니다. Python, C, C++, JAVA, Javascript 등이 있습니다. 일반적으로 영어를 베이스로 합니다. 주로 if-else, while, main, include, input 등 영어 단어로 구성됩니다. 반면, 저급 언어는 하드웨어에 가까운 언어입니다. 하드웨어를 조작하며, 대표적으로 2진법을 사용하는 기계어가 있습니다. 그러나 0과 1로 프로그래밍을 하는 것은 어렵기 때문에 기계어와 영어 단어를 1대1 대응으로 치환해 만들어진 언어를 어셈블리어라고 합니다. EDSAC 개발진 중 한명인 David Wheeler가 고안했습니다. 어셈블리어는 CPU 아키텍처에 따라..
컴퓨터 시스템의 구성 요소와 컴퓨터 아키텍처, 그리고 명령어 집합 구조와 종류별 특징은 무엇인지 알아보겠습니다. 컴퓨터 시스템의 구성 요소 컴퓨터 시스템은 크게 하드웨어와 소프트웨어로 구분됩니다. 하드웨어는 컴퓨터의 기계적인 장치를 의미합니다. 소프트웨어는 하드웨어의 동작을 제어하고 지시하는 모든 종류의 프로그램을 의미합니다. 컴퓨터의 구조를 그림으로 살펴보겠습니다. 컴퓨터의 하드웨어에는 중앙처리장치와 기억장치, 입출력 장치가 있습니다. 입출력 장치에서 입력을 받으면 이를 처리하고 출력하는 구조입니다. 소프트웨어는 시스템 소프트웨어와 응용 소프트웨어로 나뉩니다. 시스템 소프트웨어는 운영체제 등 하드웨어를 조작하는 것을 담당하고, 응용 소프트웨어는 그 위에서 작동하는 브라우저, 문서 편집기 등의 프로그램입..
프로그래밍 언어는 저급 언어와 고급 언어로 분류할 수 있습니다. 저급 언어에는 기계어(Machine Language)와 어셈블리 언어(Assembly Language)가 있습니다. 고급 언어는 C언어, JAVA, Python 등 다양합니다. 사람이 쉽게 이해할 수 있는 자연어로 구성돼 있다는 특징이 있습니다. 저급 언어와 고급 언어의 정의와 종류를 알아보고 각각 어떤 특징이 있는지 알아보겠습니다. # 저급 언어, 저수준 언어(Low-Level Language) 저급 언어는 컴퓨터가 이해하기 쉬운 언어입니다. 기계 친화적인 언어로도 볼 수 있습니다. 저급 언어는 기계어와 어셈블리어가 있습니다. 간단하게 기계어는 0과 1로 이루어진 2진수 체계의 언어고 어셈블리어는 기계어를 영문자 기호로 치환한 언어입니다...