본문 바로가기
정보보안

과제)

by IT매니절 2024. 5. 9.

1. C언어의 문법 중 배열, 포인터, 구조체에 대해서 공부해오기
- 1차원 배열, 2차원 배열
- 1차원 포인터, 2차원 포인터
- 구조체 포인터
 
2. /etc/passwd, /etc/shadow의 구조체 알아보기
- 해당 구조체들의 정보를 출력하는 함수를 이용해 출력 프로그램 작성 (쉘이든, c언어든)

--------------------------------------------------------------------------------------------------------------------------

 

 

1차원 배열
: 같은 자료형(같은 타입 변수)으로 연속된 메모리 공간을 할당하여 사용하는 것.

배열의 첨자가 하나만 사용되는 것. ex) abc[1]

 

2차원 배열
: 배열 요소로 1차원 배열을 가지는 배열.
첨자가 2개 사용됨.

 

포인터
: 메모리의 주소값을 저장하는 변수.
일반 변수는 특정 데이터 값을 가지지만, 포인터 변수는 특정 데이터가 저장된 주소값을 가짐.
( C언어의 주소값 : 예를들어 int형 데이터는 4Byte인데, 주소값 자체는 시작주소 1Byte만 가리킴 )

 

포인터 변수 선언
: 자료형 *변수명;
ex) int *test;

test = &a; 로 a의 주소값을 대입해두었을 때.

 

참조할 때
1) 기본 참조
test : 주소를 갖고 있음. a 변수의 주소값

2) *(내용연산자)로 참조
*test : 주소에 저장된 데이터값을 구한다 a변수의 데이터값.

값을 할당할 때
*test = 100;
=> test가 갖고 있는 주소는 a의 주소이다. a의 데이터값에 100이 할당된다.

주소를 연산할 때
test--;
=> 포인터를 1 감소시킨다. ( char형은 1, int형은 4, 실수형은 8단위로 주소위치가 감소됨 )

 

void형 포인터
: 대상이 되는 데이터 타입을 명시하지 않은 포인터. 어떠한 값도 가리킬 수 있지만, 포인터 연산이나 메모리 참조같은 작업은 할 수 없음. 때문에 사용하려면 명시적 타입 변환을 하고 난 뒤에 사용하여야 한다.

void *p;
p = (int*) &number;
p = (char*) &char_txt;

 

 

배열과 포인터의 관계가 무엇인가?

=> 첨자없이 배열만 사용할 경우, 포인터처럼 배열의 첫 번째 인덱스가 있는 주소를 가진다.

포인터에 배열명을 대입하면 포인터를 배열명처럼 사용할 수 있게 된다.

ex)
int arr[3] = {1, 2, 3};
int *arr_p = arr;

printf("%d", p[0]);



2차원 배열 참조
ex)
int arr[3][2] = {{1, 2}, {1, 3}, {2, 3}};
int *arr_p = arr; //arr, arr[0], arr[0][0] 전부 가능

while문으로 printf("%d", p); 이렇게 실행하면 순서대로 1 2 1 3 2 3 이 찍힌다.

 

 

이중 포인터
: 자료가 있는 곳을 이중으로 가리키는 포인터
이중포인터가 가리키는 주소에는 주소값이 들어가 있고, 그 주소로 다시 찾아가면 자료가 들어 있는 구조

ex)
int value = 10;
int *v_p = &value;
int **v_pp = &p;

 

 

 

구조체
: 각기 다른 자료형들을 모아서 새로운 자료형을 만드는 것

struct test {
 char name[50];
 int age;
 float test_nb;
}

struct test t;
t = {"ttt", 18, 2}
// 초기화

printf("%s", t.name);
printf("%d", t.age);
printf("%f", t.test_nb);
// 사용

 

구조체 포인터
: 참조연산자 *만 붙여주면 구조체 포인터 선언을 할 수 있다.

struct test t;
struct test *t_p = &t;

strcpy((*t_p).name, "testNm");
// 구조체 자체를 복사하는 memcpy도 있다

printf("%s", (*t_p).name);
printf("%s", t_p->name);
// 간접멤버 참조연산자 -> 를 이용해서도 참조를 할 수 있다.

 

 

1) /etc/passwd 구조체

pwd.h 파일에 /etc/passwd 파일에 관련된 함수, 구조체가 정의되어 있다

 

cat /usr/include/pwh.h

 

#include <stdio.h>
#include <pwd.h>

int main(int argc, char *argv[]){
        struct passwd *pwd;

        while((pwd = getpwent()) != NULL){
                printf("name: %s, UID: %d \n", pwd->pw_name, pwd->pw_uid);
        }
        return 0;
}

결과
----
name: root, UID: 0
name: bin, UID: 1
name: daemon, UID: 2
name: adm, UID: 3
name: lp, UID: 4
name: sync, UID: 5
name: shutdown, UID: 6
name: halt, UID: 7
name: mail, UID: 8
name: operator, UID: 11
name: games, UID: 12
name: ftp, UID: 14
name: nobody, UID: 99
name: systemd-network, UID: 192
name: dbus, UID: 81
name: polkitd, UID: 999
name: sshd, UID: 74
name: postfix, UID: 89
name: chrony, UID: 998
name: user1, UID: 1000
name: user2, UID: 1001
name: ntp, UID: 38

 

UID로 읽기 : getpwuid()
이름으로 읽기 : getpwname()
순차적으로 읽기 : getpwent()

 

 

2) /etc/shadow 구조체

shadow.h 파일에 /etc/shadow 파일에 관련된 함수, 구조체가 정의되어 있다

 

cat /usr/include/shadow.h

#include <stdio.h>
#include <shadow.h>

int main(int argc, char *argv[]){
        struct spwd *shaw;

        while((shaw = getspent()) != NULL){
                printf("name: %s, E_pw: %s \n", shaw->sp_namp, shaw->sp_pwdp);
        }
        return 0;
}


결과
----

name: root, E_pw: $ 생 략 $ 생 략 $ 생 략 .
name: bin, E_pw: *
name: daemon, E_pw: *
name: adm, E_pw: *
name: lp, E_pw: *
name: sync, E_pw: *
name: shutdown, E_pw: *
name: halt, E_pw: *
name: mail, E_pw: *
name: operator, E_pw: *
name: games, E_pw: *
name: ftp, E_pw: *
name: nobody, E_pw: *
name: systemd-network, E_pw: !!
name: dbus, E_pw: !!
name: polkitd, E_pw: !!
name: sshd, E_pw: !!
name: postfix, E_pw: !!
name: chrony, E_pw: !!
name: user1, E_pw: $ 생 략 $ 생 략 $ 생 략 .
name: user2, E_pw: $ 생 략 $ 생 략 $ 생 략 .
name: ntp, E_pw: !!

 

사용자명으로 읽기 : getspnam()
순차적으로 읽기 : getspent()

 

 

'정보보안' 카테고리의 다른 글

정보보안2 4차시  (0) 2024.05.12
정보보안2 3차시  (0) 2024.05.11
정보보안2 2차시  (0) 2024.05.05
정보보안2 1차시  (0) 2024.05.04
정보보안1 8차시  (0) 2024.04.28