🔧Kali Linux :: 

칼리리눅스는 단순한 운영체제가 아니라 침투 테스트와 디지털 포렌식을 위해 설계된 플랫폼입니다. 윤리적 해킹을 위한 도구모음이며 시스템 테스트를 통하여 보호와 분석을 할 수 있는 도구

 

NETX -> 하나 더뜨는데 NEXT
Enhanced Keyboard Driver 향샹된 키보드 드라이버라는데 별차이가 없다고한다
Next

 

설치중

https://www.kali.org/get-kali/#kali-installer-images

 

Get Kali | Kali Linux

Home of Kali Linux, an Advanced Penetration Testing Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments.

www.kali.org

필자는 여기서 다운로드했다.

 

 

압축을 풀고 Open a Virtual Machine 클릭후 폴더들어가면 된다

 

 

 

 

구동결과 2GB 에서도 동작은 되지만 4GB 사용하자 

 

초기 유저네임과 비밀번호는 Kail

최초실행시 가장 먼저 해야할것이 있습니다.

다음과 같은 명령어를 이용해 업데이트 하면됩니다.

sudo apt update
sudo apt upgrade

 

추가로 나중에 로그인하면 바로 root 권한을 받을수있게 할수있음 

 

배열

배열은 동일한 데이터 타입의 여러 값을 하나의 이름으로 연속해서 저장하는 자료 구조

 

예시

 

자료형 변수이름 요소개수
short student [20]

short student[20]; 은 2바이트 정수형 데이터를 20개를 저장할 수 있는 배열을 student라는 이름으로 선언한다는 뜻이다.

[]대괄호를 이용하여 저장공간을 몇 개 만들 것인지 명시하면된다 이때 저장할 요소 개수는 반드시 숫자 상수로 명시해야한다. (short는 2바이트 2x20 = 40바이트)

 

배열의 특정 요소에 값 대입할려면

student[1] = 10;

명령문을 사용하면된다 

student[0] student[1] student[2] student[3] .... student[18] student[19]
  10     ....    

 

 

배열 초기화하기

배열 문법은 지역변수를 그룹으로 묶은 것이기 떄문에 배열 문법으로 선언한 변수도 지역 변수처럼 자동으로 초기화 되진 않는다.

그래서 각 요소에 일정한 값을 대입하여 초기화해서 사용해야합니다.

 

초기화를 하지 않았을때

#include <stdio.h>

void main()
{
    short student[20];

    student[1] = 10;
    printf("%d %d\n", student[1], student[2]);
}

 

 

결과값

 

초기화 했을때

#include <stdio.h>

void main()
{
    short student[20], i;

    for (i = 0; i < 20; i++) student[i] = 0;

    student[1] = 10;
    printf("%d %d\n", student[1], student[2]);
}

결과값

 

배열의 요소를 초기화 하지 않고 사용하면 예상하지 못한 값이 들어가게 됩니다.

그래서 예상할 수 있는 값으로 배열의 요소들을 초기화 하는것이 기본입니다. 

(일반적으로 0을 사용)

 

 

배열로 문자열 표현하기

c언어에서 문자를 저장하는 데 가장 적합한 자료형은 char형입니다. 

예시로 happy 라는 단어를 적기위해선 

char data[6] = {'h', 'a','p','p','y',0}; //0라고 적어도 되고 \0 이라고 적어도 된다.
//최적화 시 
char data[6] = "happy";

 

총 6개의 배열이 필요합니다.

0을 대입한 이유는 문자 끝에 NULL을 입력해 줌 으로써 이 배열에 저장된 정보는 문자열이다 라고 선언한것과 같기 때문입니다. 

 

 

2차원 배열

앞에 있는 내용들은 1차원 배열이고 지금은 2차원 배열에 대해 적어보겠습니다.

char data[5][4];
/* 
data[4][5] 가 아닌 [5][4] 인 이유는 
연산자 우선순위 때문 []연산자는 동일한 우선순위를 가질 때 
왼쪽에서 오른쪽으로 연산을 수행하기 때문
*/

 

char = 자료형

data = 변수 이름

[5] = 그룹 개수(행)

[4] = 그룹당 세부 요소 개수 (열)

data의 변수의 크기는 (자료형의 크기) X (행 개수) X (열 개수) = 1x5x4=20byte 입니다.

                               열
data[0][0] data[0][1] data[0][2] data[0][3]
data[0][0] data[0][0] data[0][1] data[0][2] data[0][3]
data[1][0] data[1][0] data[1][1] data[1][2] data[1][3]
data[2][0] data[2][0] data[2][1] data[2][2] data[2][3]
data[3][0] data[3][0] data[3][1] data[3][2] data[3][3]
data[4][0] data[4][0] data[4][1] data[4][2] data[4][3]

 

data 변수에 2번째 행, 3번째 열에 10이라는 값을 넣는다고하면

data[1][2] = 10;

 

실제로는 컴퓨터가 2차원 개념을 제공하지 않기 때문에 1차원 형태로 메모리에 저장됩니다.

 

 

 

 

더보기

c언어의 꽃은 배열과 포인터라고 생각된다.

솔직히 지금도 수박 겉핣기라고 생각한다. 

 

 

'language > C language' 카테고리의 다른 글

C language :: 2  (1) 2024.11.10
C language :: 1  (0) 2024.11.10

C언어를 공부하며 진짜 시작이구나를 생각했던 구간

 

비트 단위 연산자가 필요한이유

비트는 0과 1을 저장할수 있는 공간이다 자료를 저장할수 있는 프로그램을 만들 때 비트 단위로 연산한다면 메모리를 많이 절약 할수 있다는 장점을 가지고 있다.

 

data = 0110 1010 //2진수

data = 0x5A 16진수 로 표현이 가능하다.

 

0 X 0 1 1 0 1 0
7번 비트 6번 비트  5번 비트  4번비트 3번 비트  2번 비트 1번 비트  0번 비트 

오른쪽에서 윈쪽으로 갈수록 비트 번호가 커진다

 

시프트 연산자

시프트 연산자 <<, >> 는 변수의 값을 지정한 비트 수만큼 왼쪽 또는 오른쪽으로 비트를 이동시키는 기능을함 

 

//오른쪽에서 왼쪽으로 이동

// 변수 << 이동할 비트 수
unsigned char data = 0x1A;
//이동전 : 0001 1010
data = data <<2;
//이동후 0110 1000
//왼쪽에서 오른쪽으로 이동

//변수 >> 이동할 비트 수

unsigned char data = 0x1A;
//이동전 0001 1010
data = data >> 2;
//이동후 0000 0110

 

이동한 비트들이 메모리 공간의 크기를 벗어나면 해당비트들은 사라지고 비트가 이동한 빈자리에는 0이 채워집니다.

비트가 왼쪽으로 이동해서 사라지는것을 오버플로우(Overflow)라고 부르고

오른쪽에서 이동해서 사라지는것을 언더플로우(Underflow)라고 부릅니다.

 

 

<< *2       /2>>

10진수 16 8 4 2 1
2진수  0001 0000 0000 1000 0000 0100 0000 0010 0000 0001

<<연산을 사용하여 n개의 비트를 오른쪽에서 왼쪽으로 이동하면 2n을 곱한 것과 같고 

>>연산을 사용하여 n개의 비트를 왼쪽에서 오른쪽으로 이동하면 2n을 나눈것과 동일하다 .

즉 data = data <<3은 data = data*2의3승 과 같다는 뜻이고 data = data >>2 는 data = data/2의2승과 같다 

 

시프트 연산자 사용시 주의할점 

시프트 연산자의 우선순위가 + 덧셈 연산자보다 낮다 그래서 곱셈 나눗셈 로 이루어진 수식을 그대로 사용할 경우 잘못된 결과가 나올수 있다. 이문제를 해결할려면 괗로를 이용하여 결과값을 도출하면 된다.

비트 연산자

 비트 연산자는 비트 단위로 AND(&), OR(|), XOR(^), NOT(~) 연산을 수행합니다. 

 C language :: 1 장 참조

 

AND(&)연산

두 값을 비트 단위로 AND 연산을 수행 

 0000 1111(0x0F)
&0011 1100(0x3C)
---------------
 0000 1100(0x0C)

 

OR(|)연산

두 값을 비트 단위로 OR연산을 수행

 0000 1111(0x0F)
|0011 1100(0x3C)
----------------
 0011 1111(0x3F)
 

 

XOR(^) 연산

두 값을 비트 단위로 XOR연산을 수행

 0000 1111(0x0F)
^0011 1100(0x3C)
----------------
 0011 0011(0x33)

 

 

NOT(~) 연산

각 비트의 값을 반전 시키는 작업을 수행

~0000 1111(0x0F)
----------------
 1111 0000(0xF0)

 

 

지정한 비트를 0으로 설정하기

AND 연산자 &을 사용하면 된다.

 ???? ???? //?는 0,1인지 알수없음
&1111 1011 // 2번 비트만 0으로 설정함
--------- 
 ???? ?0?? //2번 비트만 0으로 바뀜

임의의 비트를 1로 설정할수있습니다. 

0x04를 직접 명시하지 않고 2번비트라는 정보만 가지고 만들어보면 ... 

unsigned char lpam_state; //lamp_state 에 어떤값이 있는지 알 수 없음
unsigned char bit_num = 2; // 1로 만들 비트 번호
unsigned char mask = 0x01 << bit_num; //0x04
lamp_state = lamp_state | mask // lamp_state의 2번 비트만 1로 변경

 

이를 함수로 만들어보면 

#include <stdio.h>

unsigned char SetBit(unsigned char dest_data, unsigned char bit_num)
{
    if (bit_num < 8) dest_data = dest_data | (0x01 << bit_num);
    return dest_data;
}

void main()
{
    unsigned char lamp_state = 0x77;   /* 0x77 → 0111 0111 */
    printf("%X->", lamp_state);        /* 변경 전 값 출력 */
                                       /* lamp_state 변수의 3번째 비트를 1로 설정 */
    lamp_state = SetBit(lamp_state, 3);  /* 0x7F → 0111 1111 */
    printf("%X\n", lamp_state);   /* 변경 후 값 출력 */
}

결과값

이러한 방법을 통해 원하는 비트의값 , 보수이용, 데이터 암호화 등등 가능하다

더보기

1장보단 어렵지만 아직할만하다 

'language > C language' 카테고리의 다른 글

C language :: 3  (1) 2024.11.10
C language :: 1  (0) 2024.11.10

기본연산자

기본 연산자는 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 등을 수행하는 산술 연산자 (+, -, *, /, %)

증감 연산자의 전위형 후위형으로 나뉜다. 

전위형

int i = 5, sum ;
sum = ++i
/*자신의 값을 먼저 증가시켜 6을 만든 뒤 sum에 6을 대입함 i와 sum모두 6이됨*/

후의형

int i = 5. sum ;
sum = i++ ;
/*i의 값 5를 sum에 먼저 대입하고 i를 증가시킴 i는 6이고 sum은 5가됨*/

즉 전위형의 경우 값을 먼저 증감한 후에 연산을 하고 후위형은 연산을 하고 난 후에 값을 증감 하는것을 알수있음

관계연산자 

관계 연산자는 두 값을 비교하여 조건이 참인지 거짓인지 판별하는 연산자

관계 연산자 연산 특성 관계연산자 연산 특성
A < B A가 B보다 작으면 참 A >B A가 B보다 크면 참
A<=B A가 B보다 작거나 같으면 참 A>=B A가 B보다 크거나 같으면 참
A == B A와 B가 같으면 참 A!=B A와 B가 같지않으면 참
 

C문법에서는 "="은 대입연산자 이고 "=="은 관계연산자이다.

 

 
#include <stdio.h>

void main() {
	int data1 = 5, data2 = 3;
	int result1 = data1 > 7; //5는 7보다 작음으로 거짓
	int result2 = data2 <= data1; // 3은 5보다 작으므로 참
	int result3 = data2 == 7; //3은 7과 같지 않음으로 거짓
	int result4 = data2 != data1;//3은 5와 다으므로 참

	printf("result : %d, %d, %d, %d\n", result1, result2, result3, result4);
}

실행 결과값이다.

 

논리연산자

논리 연산자는 여러 조건을 결합하여 참인지 거짓인지 판별하는 연산자(&&, ||, !)

A B A && B A || B !A
0 0 0 0 1
0 1 0 1
1 0 0 1 0
1 1 1 1
논리 연산자 연산 특성
&& A와 B가 모두 T어야 결과값이 1 ,하나라도 F이면 결과값은 0
|| A또는 B가 T이면 결과값이 1 , 둘다 F일때만 결과값이 0
! A가 F이면 결과 값이 1, A가 T이면 결과 값이 0
#include <stdio.h>

void main()
{
	int data1 = 5, data2 = 3;   /* 두 변수에 초기값을 5와 3으로 설정 */
								/* OR 연산자 */
	int result1 = 0 || 1;
	/* AND 연산자. 3 && -1은 1 && 1과 같기 때문에 결과는 참이다 */
	int result2 = 3 && -1;
	/* OR 연산자. data1 == 3은 거짓, data2 == 3은 참이다. */
	int result3 = data1 == 3 || data2 == 3;
	/* AND 연산자. data1 == 3은 거짓, data2 == 3은 참이다. */
	int result4 = data1 == 3 && data2 == 3;
	/* data1은 0이 아니라서 참이다. 참에 NOT 연산하면 거짓이 된다. */
	int result5 = !data1;
	/* 관계 연산의 결과는 0 또는 1로 나온다 */
	printf("result : %d, %d, %d, %d, %d\n", result1, result2, result3, result4, result5);
}

결과값

 

 

C 언어의 연산자 우선순위를 표로 정리하면 다음과 같다. 우선순위가 높은 연산자일수록 먼저 계산된다

 

우선순위 연산자 설명 결합 방향
1 () 괄호 -
  [] 배열 첨자 좌 -> 우
  ->, . 멤버 접근 좌 -> 우
2 ++, -- (후위) 후위 증감 좌 -> 우
3 ++, -- (전위), +, - 전위 증감, 단항 연산 우 -> 좌
  !, ~ 논리 NOT, 비트 NOT  
  (type) 형 변환  
4 *, /, % 곱셈, 나눗셈, 나머지 좌 -> 우
5 +, - 덧셈, 뺄셈 좌 -> 우
6 <<, >> 비트 이동 좌 -> 우
7 <, <=, >, >= 관계 연산 좌 -> 우
8 ==, != 동등/비동등 좌 -> 우
9 & 비트 AND 좌 -> 우
10 ^ 비트 XOR 좌 -> 우
11 ` ` 비트 OR
12 && 논리 AND 좌 -> 우
13 `   `
14 ? : 조건 (삼항) 연산자 우 -> 좌
15 =, +=, -=, *=, /=, %= 대입 및 복합 대입 연산자 우 -> 좌
16 , 쉼표 연산자 좌 -> 우

 

더보기

딱히 어려운점은 없었다 하지만 관계나 논리연산자의 수가 많아 외워야 하는점이 있다. 

 

 

 

 

 

 

문제 오류시 지적 환영입니다. 

 

'language > C language' 카테고리의 다른 글

C language :: 3  (1) 2024.11.10
C language :: 2  (1) 2024.11.10

드림핵. 대학교에서 배운 리눅스에 관해 실습하며 끄적 어볼 예정

 

sudo: 리눅스 및 유닉스 기반으로 관리자 권한을 일시적으로 부여하는 명령어 

apt:  소프트웨어 패키지의 설치, 업데이트, 삭제 등을 편리하게 관리할 수 있도록 해줌

1: 기초 명령어

#sudo apt update : 설치가능한 소프트웨어 패키지 목록을 업데이트한다 

#sudo apt upgrade : 소프트웨어 패키지의 버전을 업그레이드한다 오래된 소프트웨어 패키지에 존재하는 취약점은 보안문제를 일으킬 수 있기 때문에 주기적으로 소프트웨어 패키지를 업그레이드하여 보안문제게 예방하는 것이 좋다.

 

#ls list의 줄임말로 디렉토리의 내용을 출력하는 명령어 

-l 을추하가면 #ls -l 자세한 정보를 함께 출력한다.

 

 

#cd:(Change Directory)의 줄임말 작업 중인 디렉토리를 변경하는 명령어

cd엔 절대경로 상대경로에 대해 알아야 한다

pwd: 현제 작업 중인 디렉토리 경로를 출력 

 

절대 경로: 루트 디렉토리 / 를 시작으로 모든 경로를 적어서 표현하는 경로 ex) /home/user

상대 경로: 현제 디렉토리 기준으로 상위 디렉토리 또는 하위 디렉토리로 뻗어 나가는 경로로 말한다 

cd .. , cd /

 

#mkdir(Make directory)의 줄임말 디렉토리를 생성하는 명령어 ex)  mkdir new1 현제 디렉토리에 new1 이라는 디렉토리를 생성

 

#touch: 새로운 파일을 만드는 데 사용함 

예시) 
user@user-VirtualBox:~$ cd new_dir
user@user-VirtualBox:~/new_dir$ ls -l
total 0
user@user-VirtualBox:~/new_dir$

ls -l 실행해 보면 아무런 파일이 존재하지 않음

 

예시) touch 사
user@user-VirtualBox:~/new_dir$ touch new_file
user@user-VirtualBox:~/new_dir$ ls -l
total 0
-rw-rw-r-- 1 user user 0 9월  1 20:59 new_file
user@user-VirtualBox:~/new_dir$

touch new_file 명령어 실행한 후 ls-l을 실행하면 파일이 생성되었음을 알 수 있다. 

 

 

#mv: (move)의 줄임말 파일이나 디렉토리의 위치를 옮길 때 사용하는 명령어 또한 이름을 변경할 때에도 사용할 수 있다.

예시) 이름변경
user@user-VirtualBox:~/new_dir$ ls -l
total 0
-rw-rw-r-- 1 user user 0 9월  1 20:59 new_file
user@user-VirtualBox:~/new_dir$ mv new_file old_file
user@user-VirtualBox:~/new_dir$

 

예시 ) 파일 옮기기 
user@user-VirtualBox:~/new_dir$ ls
old_file
user@user-VirtualBox:~/new_dir$ ls ..
Desktop    Downloads  new_dir   Public  Templates
Documents  Music      Pictures  snap    Videos
user@user-VirtualBox:~/new_dir$ mv old_file ..
user@user-VirtualBox:~/new_dir$ ls
user@user-VirtualBox:~/new_dir$ ls ..
Desktop    Downloads  new_dir   Pictures  snap       Videos
Documents  Music      old_file  Public    Templates
user@user-VirtualBox:~/new_dir$

 

#rm : (Remove)의 줄임말 파일이나 디렉토리를 삭제하는 명령어

+ -r 를 추가하면 디렉토리를 삭제

 

#cat : 파일의 내용을 출력하는 명령어

 

#file : 파일의 유형을 출력하는 명령어 [#file 파일경로] 형식으로 사용할 수 있음 

 

#echo: 셸에서 유저가 입력한 텍스트를 출력 

예시) echo 사용
user@user-VirtualBox:~/new_dir$ echo "Hello world!"
Hello world!
user@user-VirtualBox:~/new_dir$

추가로 echo 명령문에 > 파일명을 이어 붙이면 파일명 이름가지는 파일을 생성한다 

예시) echo로 파일생성 
user@user-VirtualBox:~/new_dir$ ls -l
total 0
user@user-VirtualBox:~/new_dir$ echo "Hello world!" > hello
user@user-VirtualBox:~/new_dir$ ls -l
total 4
-rw-rw-r-- 1 user user 13 9월  2 13:05 hello
user@user-VirtualBox:~/new_dir$ cat hello
Hello world!
user@user-VirtualBox:~/new_dir$

 

 

#cp : (copy)의 줄임말로 파일이나 디렉토리를 복사하는 명령어 

디렉토리를 복사할 땐 -r 플래그를 붙인 cp -r 을 사용하면 된다 

 

#grep : 전체에서 특정 문자열을 찾을 때 사용 [#grep 문자열 파일] 형식으로 사용가능

예시) grep 사용
user@user-VirtualBox:~/new_dir$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:121:127:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin

 

#man : 명령어의 매뉴얼을 보여주는 명령어입니다. 명령어 사용법, 옵션,예제 등 유용한정보를 담고있습니다.

man cp를 하면 ... 

예시) man cp 

CP(1)                            User Commands                           CP(1)

NAME
       cp - copy files and directories

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

       -a, --archive
              same as -dR --preserve=all

       --attributes-only
              don't copy the file data, just the attributes

       --backup[=CONTROL]
 Manual page cp(1) line 1 (press h for help or q to quit)

 

#curl : (client URL) 의 줄임말로 서버에 데이터를 보내거나 서버로부터 데이터를 받는 데이터 전송 명령어

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

옵션종류 

-o file : 전송받은 데이터를 파일에 저장

-i : 결과 값에 HTTP응답헤더를 포함

-x "method" : HTTP 요청메소드를 지정

-d "key=value" : HTTP POST 메소드로 데이터를 전송

 

2. 와일드카드

? , *, [] : 와일드카드 는 리눅스에서 임이의 다른 문자를 나타낼 수 있는 특수 문자들을 의미 

 

 

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

예시) ? 사용
user@user-VirtualBox:~/new_dir$ ls -l
total 8
-rw-rw-r-- 1 user user 13 9월  2 13:05 hello
-rw-rw-r-- 1 user user 13 9월  2 13:08 world
user@user-VirtualBox:~/new_dir$ cat he?lo
Hello world!
user@user-VirtualBox:~/new_dir$

 

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

user@user-VirtualBox:~/new_dir$ cat h*
Hello world!
user@user-VirtualBox:~/new_dir$ 

 

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

user@user-VirtualBox:~/new_dir$ ls -l
total 8
-rw-rw-r-- 1 user user 13 9월  2 13:05 hello
-rw-rw-r-- 1 user user 13 9월  2 13:08 world
user@user-VirtualBox:~/new_dir$ touch test1 test2 test3
user@user-VirtualBox:~/new_dir$ ls -l
total 8
-rw-rw-r-- 1 user user 13 9월  2 13:05 hello
-rw-rw-r-- 1 user user  0 9월  2 13:10 test1
-rw-rw-r-- 1 user user  0 9월  2 13:10 test2
-rw-rw-r-- 1 user user  0 9월  2 13:10 test3
-rw-rw-r-- 1 user user 13 9월  2 13:08 world
user@user-VirtualBox:~/new_dir$ ls test[0-9]
test1  test2  test3
user@user-VirtualBox:~/new_dir$ 

 

 

3: 리다이렉션

Redirection 은 모니터에 나타나는 표준 출력 혹은 키보드로 입력하는 표준 입력을 다른곳으로 변경하는 작업

명령어론 >, >>, <이 있다

 

명령어 > 파일 

예시) >사용
user@user-VirtualBox:~/new_dir$ ls test[0-9]
test1  test2  test3
user@user-VirtualBox:~/new_dir$ ls test[0-9] > world
user@user-VirtualBox:~/new_dir$ cat world
test1
test2
test3
user@user-VirtualBox:~/new_dir$ 

요약:  ">"기존 파일을 덮어쓰고 새롭게 기록

">>" 기존 파일에 내용을 추가해서 기록 

 

명령어 >> 파일 

예시) >> 사용
user@user-VirtualBox:~/new_dir$ cat hello
hello
user@user-VirtualBox:~/new_dir$ cat hello >> world
user@user-VirtualBox:~/new_dir$ cat world
test1
test2
test3
hello
user@user-VirtualBox:~/new_dir$

요약: ">>" 기존 파일에 내용을 추가해서 기록

 

명령어 < 파일 

예시) <사용
user@user-VirtualBox:~/new_dir$ cat world
test1
test2
test3
hello
user@user-VirtualBox:~/new_dir$ grep test < world
test1
test2
test3
user@user-VirtualBox:~/new_dir$

입력 리다이렉션이라고 부르기도하며 파일에서 입력받아 명령어에 전달할 때 사용된다

 

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

파이프는 "|" (\)을 사용 

user@user-VirtualBox:~/new_dir$ ls -l
total 8
-rw-rw-r-- 1 user user 13 9월  2 13:05 hello
-rw-rw-r-- 1 user user  0 9월  2 13:10 test1
-rw-rw-r-- 1 user user  0 9월  2 13:10 test2
-rw-rw-r-- 1 user user  0 9월  2 13:10 test3
-rw-rw-r-- 1 user user 13 9월  2 13:08 world
user@user-VirtualBox:~/new_dir$ ls -l | grep hello
-rw-rw-r-- 1 user user 13 9월  2 13:05 hello
user@user-VirtualBox:~/new_dir$  

 

4:권한

리눅스에서는 각 유저의 이름과 고유한 사용자ID(UID)를 가지고 있다. 여러유저가 속할수 있는 그룹으로 이역시

고유한 그룹ID(GID)를 가지고있다.

 

#cat /etc/passwd은 유저 정보를 담고있는 텍스트 파일이다. 각 사용자 이름, 사용자ID 속해있는그룹ID등의 정보를 내포하고있다.

 

#cat /etc/group 은 리눅스의 그룹정보를 저장하는 텍스트 파일이다. 위와같이 각그룹의이름, 그룹ID, 그룹에 속한유저목록등을 내포하고있다

 

예시)

예시)
lrwxrwxrwx   1 root root        
drwxr-xr-x   4 root root       4096

먼저 앞 첫글자를 보면 된다

l = 은 심볼릭링크를 나태 난다(심볼릭링크 = 바로가기와 같은 링크파일)

d = 디렉토리임을 나타낸다. 

 

그 후 나머지 총 9개의 문자로 나눠지는데 각 3자리씩 소유자(owner), 그룹(group), 기타 사용자(others)에 대한 권한을 나타낸다.

 

r -
읽기 권한 쓰기 권한 실행 권한(디렉토리일경우 내용에 접근할 수 있도록 허용) 권한없음

 

예시로 d   rwx   r-x   r-x를 풀어서 해석해 보겠다

위치 설명
첫 문자 (d)  디렉토리
첫 번쨰 그룹 (rwx) 소유자(OWNER)의 권한         [r읽기][w쓰기][x실행]
두 번째 그룹 (r-x) 그룹(GROUP)의 권한             [r읽기][-][x 실행]
세 번째 그룹 (r-x) 기타 사용자(OTHERS)           [r읽기][-][x 실행]

참고로 4096은 파일의 크기이다 (바이트단위) 

첫 번째 열 : d , l [drwxr-xr-x 1 root root]

위 참조표 확인

두번 째 열 : 권한 [drwxr-xr-x 1 root root]

위 참조표 확인

 

세 번째 열 user: 소유자  [drwxr-xr-x 1 root root]

세 번째 열이 파일또는 디렉토리의 소유자를 나타낸다

 

네 번째 열 user : 소유 그룹 [drwxr-xr-x 1 root root]

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

 

5. 파일 및 디렉토리 권한 명령어 

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

명령어 으론 [chmod 권한 파일명] 형식으로 사용합니다. 권한을 표현할때는 10진수나 기존 권한에 문자를 더하거나 뺍니다.

---------- 1 user user 13 9월  2 21:23 hello  //현제 권한이 부여되어 있지 않는 상태

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

#chmod 764 hello 를 실행하면 아래와 같이 변경된다 

-rwxrw-r-- 1 user user 13 9월 2 21:23 hello

tip: 쉽게 생각해서 rwx 중 -가 없으면 1로 지칭 -은 0으로 지칭

예시로 r-x 이면 

권한 r - x
2진수 1 0 1
4+1=6 4 2 1

 

hello 파일 소유 그룹에 실행권한을 부여할시 다음고 같은 명령어를 입력하면된다

#chmod g+x hello

-rwxrwxr-- 1 user user //결과

권한을 제거 하고싶으면

#chmod g-wx hello

-rwxrwxr-- 1 user user //결과

 

 

chown (사용자명) chgrp(그룹명): chown은 파일 소유자 혹은 소유 그룹을 변경하는 명령어 입니다. 단 root 유저만 실행할 수 있습니다. 

[#chown [사용자명or그룹명] 파일명] 형식으로 됩니다. 

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

 

예시)
user@user-VirtualBox:~/new_dir$ sudo chown root hello // 명령어 실행
-rwxr--r-- 1 root user   13 12월  2 13:05 hello // 결

 

 

setuid(특수권한) : 일반 사용자가 파일을 실행하면 파일 소유자 권한으로 실행된다 

소유자의 실행권한에 x대신 s문자로 나타낸다 

단 대문자 S일경우 setuid가 걸려있으나 실행권한이 없다

 

setgid : 일반 사용자가 파일을 실행하면 소유그룹권한으로 실행된다. 소유그룹의 실행 권한에 x 대신 s문자로 표시됩니다. 마찬가지로 setgid가 걸려있지만 실행권한이 없는경우는 대문자 S로 표시된다.

 

sticky bit : sticky bit 를 설정하면 소유자와 root 사용자 외에 일반 사용자가 파일을 삭제 할수없다 주로 공용디렉토리에 사용 일반사용자의 실행 권한에 x 대신 t로 나타낸다 이 역시 실행권한이 없는 경우에는 대문자 T로 표시됨  

 

 

setuid = 4

setgid = 2

sticky bit = 1

 

예시) world 파일 권한 변경
#chmod 4755 world  //실행 setuid 설정

-rwsrwxr-x 1 user user  //결과 

 

setgid는 chmod g+s world,

sticky bit는 chmod o+t world로 설정할 수 있다.

 

5. 디렉토리 구조 

/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에는 다양한 로그 파일이 저장됩니다.

 

+추가로 vi명령어는 블로그 참조하였음 

https://potato-yong.tistory.com/132

 

기술블로그는 처음이다.

 

지금까지 공부했던것들을 기록하고 까먹지 않도록 다시 되새기는 역할을 위해 만들어본다

 

또한 지금까지 미루던 보안공부를 빡쌔게 해볼생각이다 

 

초등학교때부터 컴퓨터 보안에 관심이 많아서 보안전문가 그중에 모의해킹을 이라는 꿈을 항상 동경해왔다.

하지만 지금 너무 소홀하게 지내다보니 수많은 시간이 지나 25살이 되고 살짝 후회중이다.

블로그를 시작하며 과거에 얽매이지 않고 하나하나 다시 꿈을 이뤄볼려고 한다.

그리고 정보보호학과로 편입성공후 꼭 BOB에 합격하고싶은 바람도 크다(나도 합격후기 남기고싶어) 

 

 

+틀린정보가 있을수도  있으니 오타/오답 이있으면 댓글부탁드립니다. 

 

 

 

 
 
 
 
 

+ Recent posts