일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ftz
- #Qt Creator
- libtins
- libpcap
- #IntelManual
- #MINT64 #Sqix
- 인터럽트
- Sqix
- 오버워치 세이버메트릭스
- linux
- Network
- vim
- BEST of the BEST
- Overwatch League SaberMetrics
- >
- command
- vi 외부 명령어
- Find
- C++11
- vi
- #Best of the Best #OS #MINT64 #Sqix
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- KASAN
- 오버워치
- #
- FTZ 레벨2
- Today
- Total
목록분류 전체보기 (76)
Sqix
이번 글은 OS를 로딩하기 위한 과정에 대해 다룹니다. 뭐 일단 부트로더를 만들고 원하는 메세지를 나오도록 출력을 하긴 했습니다만, 가장 중요한 역할인 OS 이미지를 읽어서 메모리로 복사하도록 하는 코드를 작성하지 않았습니다. 더군다나 이걸 로딩해서 쓰려면 아무래도 32비트 혹은 64비트 커널 개발을 하고 OS 이미지를 만들어야 하는데, 이건 나중에 하고 가상 이미지를 만들어 보는 것으로 진행하겠습니다. OS를 로딩하기 위해서는 BIOS 서비스를 이용해야 합니다. 따라서, 먼저 BIOS에 대해서 알아보겠습니다. BIOS는 우리에게 Interrupt라는 방식을 이용해서 서비스를 제공합니다. 기능이 담긴 함수 주소를 Interrupt Vector Table(IVT)에 담아서 우리가 Software Inter..
이번 글은 부트로더 제작에 대해 다룹니다. 기존에 제작한 부트로더는 QEMU 기본 출력만 나와 있었습니다. 이제 보다 그럴듯하게 부트로더를 만들어 보도록 합시다. (출처 : http://byuljong.tistory.com/88) 화면에 글자를 출력하기 위해서는 Video Memory의 주소를 알아야 합니다. 메모리에 형식에 맞춰 데이터를 넣는다면 원하는 것을 출력할 수 있습니다. Default 화면 설정은 80*20의 크기를 가지며, 시작 Address는 0xB8000입니다. 한 문자당 1byte씩의 문자, 속성값을 가지고, 따라서 메모리 크기는 80*25*2 == 4000 byte입니다. 위 그림에서 보이다시피, 속성값은 0~3비트의 전경, 4~7비트의 배경색으로 나뉩니다. 이는 다시 Attribut..
이번 글은 부트 로더에 대해 다룹니다. 이전에도 언급하였듯, 부트로더는 마지막 2바이트를 이용하여 검증합니다. 즉, 0x55, 0xAA를 적어 놓는다면 이를 부트로더로 인식하여 동작을 시킵니다. 하지만, 이전에도 언급하였듯 부트로더는 어셈블리 언어로 작성을 해야 합니다. 따라서 먼저 가장 기본적인 어셈블리 명령어들에 대해 간단히 알아봅시다. ASM● 사칙 연산 - add A, B A + B 연산을 진행하고, 결과를 A에 저장- sub A, B A - B 연산을 진행하고, 결과를 A에 저장- mul A AX의 레지스터 값과 A를 곱하고 AX 혹은 DX:AX에 저장- inc A A에 1을 더해 A에 저장- dec A A에 1을 빼 A에 저장- div A AX 혹은 DX:AX를 A로 나누어 몫을 AL 혹은 A..
이번 글에서는 BIOS와 부팅에 관련된 내용을 다룹니다. OS를 가동시키기 위해서는 먼저 컴퓨터를 부팅해야 합니다. 부팅 단계에서는 프로세서, 메모리, 외부 I/O 장치를 초기화하고, 부트 로더를 메모리에 복사하며, 이를 기반으로 OS를 가동하는 과정을 거칩니다. 우리가 만들고자 하는 OS는 다음과 같은 부팅 과정을 거칩니다. ======================================================================================================================[BIOS 영역] (1) 전원 On (H/W에서 user input을 받아야 합니다.) (2) POST 단계1) 프로세서 초기화2) 메모리 검사 및 메모리 초기화3) 주변 ..
이번 글에서는 운영 모드와 메모리 관리 기법에 대해서 다룹니다. x86, x86_64에서는 크게 세그먼테이션(Segmentation), 페이징(Paging) 기법을 통해서 메모리를 관리합니다. 세그먼테이션은 우리가 전체 영역을 원하는 크기로 분할하여 관리하는 것이고, 페이징 기법은 지정 단위로 잘린 영역을 모아 원하는 크기를 만들어 관리하는 방식입니다. 메모리 관리 기법을 이용하려면 각 레지스터에 맞는 특정한 자료구조를 지정해야 합니다. 세그먼테이션은 디스크립터의 위치를 지정해야 합니다. 그리고 페이징 기법에서는 컨트롤 레지스터의 CR3 레지스터에 페이지 디렉토리라고 불리는 자료구조의 물리적 주소를 설정해 주어야 합니다. 이제 위의 내용을 근간으로 각 운영 모드별 메모리 관리 방식에 대해서 알아보겠습니다..
이번 글에서는 운영체제의 다섯 가지 운영 모드(리얼 모드, 보호 모드, IA-32e 모드, 시스템 관리 모드, 가상 8086 모드)와 레지스터, 메모리 관리 기법에 대해서 알아봅니다. 1. 운영 모드 64bit OS가 지원하는 운영 모드는 총 5가지입니다. 여기에는 위에서 말씀드린 리얼 모드, 보호 모드, IA-32e 모드, 시스템 관리 모드, 가상 8086 모드가 있습니다. 우리가 만들 OS에서 필수적으로 지원해야 하는 모드는, 위 5개의 모드들 중 리얼 모드, 보호 모드, IA-32e 모드입니다. ● 리얼 모드 리얼 모드는 프로세스가 처음 동작할 때 진입하는 모드입니다. 어떤 상태에 있는 프로세서건 상관없이 전원이 켜지거나, 혹은 리셋되는 모든 프로세서는 모두 리얼 모드로 진입하게 됩니다. 리얼 모드..
한승훈 저자님의 "64bit 멀티코어 OS 원리와 구조" 책 스터디를 시작하였습니다. 사실 pr0gr4m님(https://github.com/pr0gr4m)께서 시작하신 os 스터디에 참여하였었지만, 모종의 이유로 약 4개월간 바빴던지라 이제서야 다시 시작하게 되었습니다. 해당 카테고리에서는 해당 책을 공부해나가는 과정에 대해서 작성하고자 합니다. 이번 글에서는 환경 설정에 대해 다룹니다. ※ 개발 환경 운영체제 : Ubuntu 16.04.2 LTS 텍스트 에디터 : vim 1. GCC 및 gcc-multilib 설치 저처럼 Host OS가 우분투라면, gcc와 g++은 기본적으로 설치가 되어 있기 때문에 굳이 추가적으로 gcc를 설치하실 필요는 없습니다. 하지만, 크로스 컴파일링을 위해서 gcc-mul..
1. Introduction 해당하는 기능을 이용하시기 위해서는 C++11과 GCC 4.6버전 이상이 필요합니다. tins 3.4 버전부터 새로운 클래스가 도입되어 콜백 기반 인터페이스를 이용해 스트림을 따라 데이터를 처리하고 옵션들을 구성할 수 있습니다. 2. StreamFollower StreamFollower 클래스는 TCP 패킷을 처리하여 IP 패킷에 사용된 IP 주소와 포트를 찾아냅니다. 기본적으로 4-tuple(Source, destination IP Address, Source , destination Port)을 이용해서 구별을 하고, 새로운 4-tuple을 가진 패킷이 보일 때 마다 TCP Stream에 대한 Context를 생성하고, 사용자가 작성한 Callback Function을 이..
원본인 libtins.github.io/tutorial 에서는 Packet 전송 -> TCP Streams -> IP, DHCP Protocols -> 802.11 순서로 진행되고 있긴 하지만, 제가 현재 필요한 것은 802.11이기 때문에 이를 먼저 공부하고 작성하게 되었습니다. 1. IEEE 802.11? libtins에서는 802.11 프로토콜을 지원합니다. 가장 대표적으로 이를 이용한 툴이 aircrack-ng입니다. 802.11 프로토콜은 기본적으로 Dot11 클래스를 이용하여 구현됩니다. 이 클래스에는 모든 프레임에서 공유하는 필드가 들어있습니다. 이는 상속을 통해서 전달됩니다. 2. Management Frames 이제 Dot11Management라는 Abstract Class를 이용하는 관..
ddd 1. Sniffing 기초 스니핑은 Sniffing 클래스를 이용하여 가능합니다. 해당 클래스는 libpcap 문자열 필터를 이용이 가능하고, 네트워크 인터페이스에서 스니핑이 가능하게 해 주며, 전송되는 패킷을 해석하고, PDU 오브젝트를 제공하여 보다 쉬운 스니핑 기능을 제공합니다. 필터를 설정하면 두 가지의 패킷 검색 기능이 제공됩니다. 그 중 하나는 Sniffer::next_packet 입니다. 이 멤버함수를 이용한다면 필터를 이용해서 패킷 검색을 할 수 있습니다. Sniffer sniffer(""); // up to 64kb packet sniffer.set_filter("ip src 192.168.0.1"); // source ip address가 192.168.0.1인 패킷으로 필터링 ..