ROP Simulator

NX Bit 우회: 가젯(Gadget)을 연결하여 쉘을 획득하세요.

가젯 인벤토리

💡 Tip: 가젯을 클릭하면 스택의 빈 공간에 자동으로 추가됩니다.

스택 (Stack)

▲ 낮은 주소 (Low Address)

CPU Registers

RIP 0x400789
RDI 0x000000

Execution Log

Payload를 구성하고 실행 버튼을 누르세요.

'일반' 카테고리의 다른 글

2024.09.05  (1) 2024.09.05

필자는 H4C 교육프로그램인 빡공팟 13기 Survival Plan 과정으로 교육이수를 받았습니다.

 

처음에는 기초 지식이 거의 없는 상태에서 막연하게 "시스템 해킹" 이라는 단어에 빠져 빡공팟 커리큘럼중 시스템해킹 분야를 선택하게 되었습니다. 코스는 3개월 코스이며 대학생이며 방학시즌이라 시간이 딱 맞아 떨어져 신청하게 되었습니다. 

 

선발은 서류심사로만 진행됬으며 자기소개서 1500~2000자 분량으로 작성하였고 추가로 지원동기, 현재 학습 수준 그리고 시간을 어떻게 활용할것인지에 대해 적었습니다. 

 

방학초반에는 "시스템을 정복해보자" 였던 마인으로 임했지만 시간이 갈수록 오히러 시스템에게 정복을 당하는 기분이 들었습니다. 특히 9~11주차에서는 눈앞에 큰벽이 있는것처럼 느껴지며 막막했던 기역이 있습니다. 그래서 막막했던 주차때는 다소 소홀히 한점이 지금와서 아쉬움이 남습니다. 하지만 모든과제를 꾸준하게 재출 하며 성취감을 유지할 수 있었고 교육 프로그램도 추천할만큼 긍정적입니다.  

 

이제 빡공팟이 끝나고 나니 다시 저를 채찍질 해줄 사람이없어 허전한 마음이 드는건 사실이지만 이번 과정을 통해 합격부와 상과없이 얻어가는것이 있었습니다.

 

1. 시스템 해킹에대한 체계적인 커리큘럼 경험

2. 일주일동안 끊임없이 삽질하며 버텨내는 의지

 

비록 원하는 결과는 아니였어도 의미가 있던 시간이였고 포기하지 않고 시도해보는 성격을 가져야될것 같습니다.

 

마지막으로

필자는 20대 중반으로 편입을 하여 보안의 세계에 조금 늦게 알게되었습니다. 그만큼 늘 마음이 조이며 걱정도 많이 했습니다. 이번기회에 이 교육이 저의 첫 발판이라 생각하며 목표를 향해 다음 BOB까지 흔들리지 않고 나아가고 싶습니다. 

 

 

 

내부자료,커리큘렴 등 내부 보안으로 질문 답변을 하지못합니다. 그외에 질문은 언제든지 답변이 가능합니다. 

 

 

정규표현식의 문제입니다. 

.py코드를 다운받으면 

코드를 보면 

m = re.match(r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+', input_val)

조건이 만족하면 ./flag.txt 파일을 읽어오는 코드 입니다. 

 

문제사이트에 들어가보면 

submit 할수 있는 공백란이 있습니다. 

정규표현식에 관한 문제이니 구글링해보면 정규표현식에 대해 자세하게 나와있습니다.

플래그를 얻기위해 만족해줘야하는 표현식만 해준다면 플래그를 얻을수 있습니다.

r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+'

r: 이스케이프 문자를 문자 그래도 인식합니다

dr:문자열 dr을 매치합니다.

\w{5,7} : [A-Z a-z 0~9_]가 5개 이상 7개 이하를 매치합니다.

e : 문자열 e를 매치합니다.

\d+ : 숫자가 1개이상이면 매치합니다.

am: 문자열 am을 매치합니다.

@ : 문자열 @을 매치합니다.

[a~z]{3,7}: 소문자 알파벳이 3개 이상 7개 이하면 매치합니다.

\. : .로 끝나는 문자를 매치합니다.

\w+ : [A~z a~z 0~9_]: 가 1개 이상이면 매치합니다.

 

이를 바탕으로 

dr00000e1am@aaa.a

으로 나타내면 플래그가 획득합니다. 

'Security > Dreamhack' 카테고리의 다른 글

Dreamhack write-up #1: blue-whale  (1) 2025.05.20

Dreamhack write-up: blue-whale 풀이

 

문제

Docker hub 에서 dreamhackofficial/blue-whale 레포지토리 TAG:1 를 다운고 터미널에서 

docker images

명령어를 입력하면

다운받은 dreamhackoffcial/blue-whale 가 뜬다

도커로 실행시켜보자 

docker pull dreamhackofficial/blue-whle:1 # docker hub에서 지원하는 주소로 들어가는방법과
docker run -it 87a96c7a8db0 #으로도 들어갈수있다. 또한
docker pull 87a96c7a8db0 #이것도 가능하다

도커안에서 ls 명령어를 사용하여 디렉터리를 확인후 chall 디렉터리가 있다는걸 확인

그후 cd  chall/ 명령어를 사용하여 디렉터리에 들어간후 ls 명령어를 쳤지만 아무것도 없다는걸 확인했다.

 

문제에서 "분명 플래그 파일이 있었는데요 ... 없어졌어요" 라는말이 있다 그러면 그전에 플래그 파일이 존재했다는걸 알수 있다.

도커이미지 분석도구인 "dive" 분석도구를 사용하여 찾아보자 

sudo snap install dive

https://github.com/wagoodman/dive git 클론을 이용하여 설치할수도 있다. 

dive 87a96c7a8db0

이러면 분석도구 dive 가 켜지게 된다. 여기서 중요하게 볼것은 Layers 이다 

이 Layers를 내리다보면...

Layers 에 지워지기전 플래그를 볼수 있다. 

현재는 DH 플래그가 짤린상황 

그냥 화면을 축소 시키면 다 보여진다. ctrl + - 연타 

플래그 획득

 

더보기

마치며

필자는 dive도 성공적으로 설치했고 DH{} 플래그도 바로 발견했다

하지만 플래그가 DH{a5d6q5we4d6a5z6z5s 로 짤려있었고 

미리보기 형식인줄알고 파일을 복구 해야 하는줄 알았다.

인터넷에 열심히 찾아보았지만 이상한 sha256 코드가 필요한다더니...어쩌구 저쩌구 

계속 삽질하다가 친구가 화면 축소 해봐라 해서 알게 되었다....

 

소요시간 3시간정도

 

 
 

'Security > Dreamhack' 카테고리의 다른 글

Dreamhack write-up #2:re-reg-ex  (0) 2025.05.28

 

 

🔧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 권한을 받을수있게 할수있음 

 

메모리 주소 지정 방식

운영체제는 메모리 주소를 1바이트 단위로 관리합니다. 32비트의 경우 0~4,294,967,295번 까지 단위를 매길수 있습니다.

때문에 프로그래머가 메모리를 사용할 때 한 번에 읽거나 저장할 크기를 명시해야 합니다. 

예를들어 2바이트 크기만큼 메모리를 사용하겠다 라는 형식으로 표기하여야 합니다.

... ...
102번지 1바이트
101번지 1바이트
... ...

 

 

 

 

직접 주소 지정 방식

101번지에 1042라는 값을 2바이트 크기로 저장하겠다 라고 정의하는것이 직접 주소 지정 방식입니다.

... ...
102번지 1042(2바이트)
101번지
... ...

 

실제 메모리엔 이렇게 저장됩니다.

... ...
102번지 4
101번지 18
... ...

이유는 1042를 2진수의 값으로 나눠보면됩니다. 

1042 = 0000 0100(4) / 0001 0010(18)

리틀엔디언 바이트 정렬을 사용하여 반대방향으로 숫자가 배열된다. 

예전에 리틀엔디언에 적어둔 글이 있다 참고하면 좋을것같다.

https://inz0i.tistory.com/category/%EB%AF%B8%EB%B6%84%EB%A5%98  

 

시스템은 16진수로 저장하는것이 가시성에 좋기때문에 16진수로 나타내는것이 좋다

10진수 1042
2진수 0000 0100 0001 0010
10진수 4 18
16진수 0x04 0x12
0x0412
... ...
0x...68 0x04
0x...67 0x12
... ...

 

c언어에서 직접 주소 방식의 한계

함수 안에 선언한 변수는 해당 함수에서만 사용할 수 있고 다른 함수에 선언한 변수가 메모리에 존재해도 

문법적으로 접근할수 없기 때문입니다. 

예시로는...

#include <stdio.h>

void test(){

	short soft = 0x0000;
    soft = tips;  //오류


}

void main(){
	short tips = 0x0005;
    test();
}

각 함수의 지역 변수는 해당 함수에서만 사용 가능하기 때문입니다.

하지만 약간의 절차를 걸치면 가능합니다.

#include <stdio.h>

void test(short data){

	short soft = 0x0000;
    soft = data;  


}

void main(){
	short tips = 0x0005;
    test(tips);
}

 

이에 반해 간접 주소 지정방식도 있다

효율성과 가용성은 직접보다 간접이 더 우월하다 

하지만 간접은 직접보다 명령어가 많아 크기가 크다

 

 

포인터

포인터는 변수의 메모리 주소를 저장하는 변수로, 다른 변수나 데이터에 직접 접근할 수 있게 해줌

 

포인터는 일반 변수와 다르게  *기호를 추가로 사용하여 선언한다

short *ptr;

포인터 변수는 자료형을 선언하지 않아도 무조건 크기가 4byte 이다 (64비트 컴퓨터의 경우 8byte)

0x..... ...
0x...06E  
0x...06D 0x04
0x...06C 0x12
...  
...  
0x...69 0x00
0x...68 0x00
0x...67 0x00
0x...66 0x6C

short 2byte 은 06c 06d

*ptr은 66~69 까지 표현되어있다.

 

변수가 위치한메모리 주소를 출력해보겠습니다.

#include <stdio.h>

void main()
{
    short birthday;
    short *ptr;
    ptr = &birthday;  

    
    printf("birthday 변수의 주소는 %p  입니다.\n", ptr);
}

 

결과값

 

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

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

배열

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

 

예시

 

자료형 변수이름 요소개수
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 :: 4  (0) 2024.11.11
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 :: 4  (0) 2024.11.11
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 :: 4  (0) 2024.11.11
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

 

+ Recent posts