예전것/Linux Basic2009. 7. 16. 22:29
참조: 거의 모든것이 설명되어있다!!
http://wiki.kldp.org/wiki.php/EmacsTinyTips#s-3.7

First
emacs를 사용하기 위해 기본적으로 명령어를 알자 ctrl+h t 를 누르면 튜토리얼 모드로 들어간다.
이곳에서 emacs의 명령과 사용방법을 볼 수 있다.

Second
본격적인 설정이다.
http://www.emacswiki.org/cgi-bin/wiki/ColorTheme#toc2
이곳을 보고 우선 Color-theme를 설치하자. 영어로 되어있지만 해석하고 설치(installing부분만)
M-x color-theme-select로 ColorTheme를 설정할 수 있다.

또, C언어를 하는데 syntax마다 색깔을 다르게 주고싶을 것이다. (여느 다른 프로그램처럼)

emac를 띄운 상태에서 M-x font-lock-mode 라고 치거나(M-x 는 보통 Alt+x

설정파일(.emacs 등) 에 다음을 넣어라.

(add-hook 'c-mode-hook 'turn-on-font-lock)

◆개별 사용자에게 적용하려면 .emacs에 하는게 맞지만 모든 사용자가 그렇게하도록

/usr/share/emacs/site-lisp/site-start.el 파일에 위 내용을 추가하였다.


---나머지 설정---

처음 emacs를 설치하면 font가 형편없다. 내가 좋아하는 font로 설정해주자.

http://wiki.kldp.org/wiki.php/EmacsChangeFonts

이곳을 보고 따라하자.

내경우엔

ln -s .Xdefaults .Xdefaults-$HOSTNAME (심볼릭링크를 걸어라!)

을 해주어야지 .Xdefaults 파일을 emacs에서 제대로 읽었다. (CentOS 5.3사용중, 예전에는 .Xdefaults였으나 바뀌었다고 한다.)


자 이것으로 emacs 설정 끝

'예전것 > Linux Basic' 카테고리의 다른 글

rlogin, rsh 설치  (0) 2009.08.07
CentOS 5.3 그래픽 드라이버 설치  (0) 2009.08.04
리눅스에서 키설정 & 디버깅  (0) 2009.07.16
NFS 간단설정  (0) 2009.07.12
BASH SHELL LAB EXERCISE  (0) 2009.06.08
예전것/Linux Basic2009. 7. 16. 01:09

디버깅을 위해 참조하자
http://wiki.kldp.org/wiki.php/EmacsGdbEtagsCscope

 - console상에서의 키 설정 : loadkeys 이용한다.
키보드상의 Caps Lock과 Ctrl 키를 바꾸려면 아래와 같이 하면 된다. (keymaps 0-15를 사용한다고 가정했다. dumpkeys | head -1로 확인해볼 수 있다.)

        % loadkeys        keymaps 0-15        keycode 58 = Control        keycode 29 = Caps_Lock        %
 
위에 내용을 차례대로 한줄씩 입력 다 하고 EOF해야하던데...ctrl+d던가

디버깅으로 돌아와서 cscope 사용하는데 설정 문제가 좀있다. 기본적으로 리눅스 설치했을때 cscope는 설치가 안되어있다. emac에서 cscope가 구동되게 하기위해서 아래와 같은 작업을 한다.
#yum -y install cscope
로 설치 
1. <alt+x>load-library /usr/share/emacs/site-lisp/xcscope.el
위와같이하면 cscope를 사용할 수 있다. 하지만 매번 해줘야하므로 다음과같이한다.
#vi /usr/share/emacs/site-lisp/site-start.el
(load-library "xcscope.el") 을 추가한다.   //주의 : 반드시 괄호를 넣어라. " " 안에 들어가는것은 라이브러리

http://wiki.kldp.org/wiki.php/EmacsInstallScript
이곳에 더 자세한 설명이 나와있다.

'예전것 > Linux Basic' 카테고리의 다른 글

CentOS 5.3 그래픽 드라이버 설치  (0) 2009.08.04
emacs의 설정  (0) 2009.07.16
NFS 간단설정  (0) 2009.07.12
BASH SHELL LAB EXERCISE  (0) 2009.06.08
.bash_profile , hash  (0) 2009.06.04

[연습문제]

1. 다음중 사용자 계정을 목록화하는 유틸리티가 아닌 것은? ①
①tftp                          ②rusers
③rwho                       ④finger

2. finger 서비스에서 알아낼 수 없는 내용은 무엇인가? ④
①사용자연결               ②공유 디렉토리
③사용자 계정과 셸       ④메일 확인 시간

3. 클라이언트가 요구하는 서비스에 대해 RPC가 할당하는 포트의 범위는? ③
①1024번 포트 미만               ②1000번 포트 미만
③10000번 포트 이상              ④65535번 포트 이상

※ RPC(Remote Procedure Call)는 111번 포트를 이용하여 클라이언트가 요구하는  연결에 대한 포트를 클라이언트에게 알려주는 서비스.
 클라이언트가 SQL에 연결하고 싶을 때 자체의 포트 번호를 알지 못하면, RPC 서비스를 제공하고 있는 시스템은 10000번 이상의 번호중 SQL 서비스를 제공하는 포트를 할당하여 클라이언트에게 이를 알려준다.

4. 목록화 작업을 하지 않아도 되는 것은 무엇인가?
① 응용 프로그램 목록화
② 공유 자원 목록화
③ 해킹 공격 목록화
④ 사용자 계정 목록화
------------------------------------------------------------------------------------------------------
※공유 자원 목록화 : 공유 자원에 대한 목록화는 시스템을 침투하는 데 간접적인 도움을 준다. 다시 말하면, 상대 시스템의 설정이나 상태를 바꿀 수는 없지만 대상 시스템의 정보를 가져오기 위한 전 단계므로 매우 중요하며 치명적일 수 있다.
※사용자와 그룹 목록화 : 사용자 계정을 알아내는 것은 패스워드를 알아내기 위한 바로 전 단계다.
※응용프로그램 목록화 : 침입 대상에 대한 조사를 하다 보면 정상적인 응용프로그램이 아닌 엉뚱한 백도어 프로그램 등이 구동되고 있는 등 황당한 경우가 많다. 응용 프로그램의 목록화와 사용자에 대한 목록화는 침입에 직접적인 영향을 줄만큼 중요하다.
------------------------------------------------------------------------------------------------------

[심화 연습 문제]
1. 목록화란 무엇인가?
 - 목록화(enumeration)는 지금까지 얻어낸 정보들을 잘 정리하는 것이다. 마치 목차를 써서 한눈에 알아볼 수 있게 하는 것과 같으며, 이것은 실제 공격 바로 전 단계라고 할 수 있다.

2. NFS에 대해 간단히 설명하라
 - Network File System (NFS)은 썬 마이크로 시스템(SUN)에서 네트워크를 통해 파일을 공유할 수 있도록 만든 프로토콜 이다. NFS는 하드웨어, 운영체제 또는 네트워크 구조가 달라도 파일을 공유 할 수 있도록 고안되었다. 파일 공유등을 비롯해 다른 부가 기능을 제공한다. 하지만 공유된 파일들에 대한 보안 문제가 생길 수도 있다. 사용하는 프로토콜은 Network Lock Manager (NLM)과 Network Status Monitor (NSM)이다.

기능상 삼바와 비슷하지만 가장 큰 차이는 커널에서 NFS를 지원한다는 점이다.

NFS는 리눅스머신에서 윈도우 파티션을 마운트하여 사용하듯 NFS서버의 특정 디렉토리를 클라이언트에서 마운트하여 자신의 영역인것처럼 사용한다.

그러나 위와 같은 편리한 점에도 불구하고 보안상 많은 취약점을 드러내고 있다. 가장 단적인 예로 클라이언트인양 속여서 서버에 접속하게 되면 특정 디렉토리를 마음대로 조작할 수 있는 단점이 있다.

NFS는 스토리지가 고가였던 시절 디스크가 없는 시스템을 지원하기 위하여 개발되었으나 스토리지 및 컴퓨터의 성능이 좋아지면서 파일 공유 및 파일 서버를 위한 방법으로 사용되고 있다.


3. TFTP 서비스가 위험한 이유를 설명하라.
TFTP(Trivial File Transfer Protocol)는 기본적으로 FTP와 비슷하나 인증이 존재하지 않아 누구나 TFTP 서버에 파일을 쓰고 지울 수 있다. 대부분의 시스템에서는 보안상의 문제로 TFTP 서버를 운영하지 않는다. 하지만 라우터와 스위치 등은 TFTP를 기본적으로 구동하고 있다. 라우터와 스위치등의 운영체제가 손상되었을 경우 네트워크에서 해당 운영체제를 복사해오기 위해서다.

4. RPC가 무엇인지 간단히 설명하라.
위에 설명했음

5. NFS 공유 목록을 보는 방법에 대해 설명하라.
형식-> showmount -e ip주소
예)      showmount -e 192.243.243.1   



예전것/Linux Basic2009. 7. 12. 22:29

http://flashcafe.org/server_study/12376

이곳에 잘 써있다~~

'예전것 > Linux Basic' 카테고리의 다른 글

emacs의 설정  (0) 2009.07.16
리눅스에서 키설정 & 디버깅  (0) 2009.07.16
BASH SHELL LAB EXERCISE  (0) 2009.06.08
.bash_profile , hash  (0) 2009.06.04
CentOS netinstall  (0) 2009.05.22
예전것/웃긴거2009. 7. 9. 11:15

키커 표정 ㅋㅋㅋ

'예전것 > 웃긴거' 카테고리의 다른 글

흑형 ㅋㅋㅋㅋㅋ  (0) 2010.06.28
흐뭇해  (0) 2009.12.17

ARP (Address Resolution Protocol)
ARP는 주소 변환이 필요할때마다 각각의 주소를 매핑하도록 호출된다. ARP는 선택된 매체에 브로드캐스트를 통해 특정 IP주소를 사용하는 호스트가 응답을 하도록 요구 하는방식을 사용한다. 목적지 호스트가 응답하는 경우 송신 호스트는 목적지 호스트와 연결을 맺고 데이터를 전송하기 시작한다. ARP의 요구와 응답은 물리적인 계층에서 이루어지며, 목적지 호스트가 응답하는 경우 송신지 호스트는 ARP테이블을 설정하고, ARP테이블의 정보를 이용하여 하위 계층 프로ㅗ콜의 프레임에 저장한다.

RARP(Reverse Address Resolution Protocol)
데이터 링크 계층의 주소로부터 네트워크 계층의 주소를 얻어오는 프로토콜,
RARP패킷은 ARP패킷과 동일한 형식을 갖는다.

ICMP(Internet Control Message Protocol)
IP 프로토콜은 비연결형으로 패킷이 확실히 전송된다는 보장이 없기 때문에 라우터나 노드(호스트)등에서 오류가 생겨 목적지까지 도달하지 못하게 되는 경우가 생긴다. 이럴경우 송신측의 사애를 알려줘야 하는데, 이때 필요한것이 ICMP 포로토콜.

 ICMP Destination Unreachable
- 라우터가 특정 노드의 패킷을 목적지에 보내지 못한경우 송신노드에 대해  ICMP Destination Unreachable 메시지를 보낸다.

 ICMP Redirect 메시지
- 라우터가 송신측 노드에 적합하지 않은 경로로 설정되어 있을 경우 그 노드에 대한 최적화된 경로를 다시 지정해주는 ICMP Redirect 메시지를 보낸다.

ICMP Time Exeeded
 - 패킷이 네트워크 사이에서 무한정 돌아가지 않도록 하기 위해 각 라우터들이 패킷을 처리할때마다 TTL(Time To Live)을 감소시키다 그 값이 '0'이 되면 패킷을 패키하기위해 송신측 라우터에 ICMP Time Exeeded 메시지를 되돌려보냄으로써 패킷이 폐기된 사실을 알림

ICMP Source Quench
 - 송신측 큐값이 '0'으로 남아 송신 불능 상태가 되면 'ICMP Source Quench 메시지'를 송신측 노드에 보내고 송신측은 이를 보고 송신 패킷의 양을 제어

ICMP Echo Request
 - 송신측의 전송 패킷이 목적지 노드나 라우터에 도착했는지 확인하는데 사용한다.
예전것/프로그래밍2009. 6. 25. 21:54
10 10
20 20
30 30
위의 코드에서 *array[3] 은 분명 3개의 주소를 저장하는 공간이다.
arr1, arr2, arr3의 주소를 저장하였다.

그런데 array[0][0] array[0][1] 이건뭔가?

뒤로 돌아가서

void main()
{
    char carr[3] = { 'A', 'B', 'C'};
    char *cp = carr;

   printf("%c %c %c", cp[0], cp[1], cp[2]);
}
위의 코드에서 cp[0]..이런식으로 접근이 가능하다는것을 배웠었다.
따라서 array[0] <= 이것자체는 arr1의 주소를 담고있다. array[0][0] 하면 0번째 인덱스의 값을 참조

그값은 바로 10이다.
예전것/프로그래밍2009. 6. 25. 18:56

1. int *np
 - int형 포인터 변수로 4byte이고 int형 주소를 저장.
2. int **npp
 - 2차원포인터 변수로 4byte이고 1차원 포인터 변수의 주소를 저장
3. int arr[3]
 - int형 배열로 int 형 메모리 3개를 갖는 12 byte 메모리이다.
4. int arr[2][3]
 - 2차원 배열
5. int *arr[3]
 - int형 주소를 3개까지 저장하는 배열로 각 배열요소(arr[0] , arr[1] arr[2]) 가 int형 주소를 저장.
6. int (*arr)[3]
 - arr은 포인터 변수로 4byte이며 2차원 배열과 같은 열의 개수가 [3]인 int형 배열의 시작주소를 저장하기 위해 사용된다. 포인터 변수이므로 4byte이다.
 사용 예)

#include < stdio.h >
void main()
{
int arr2[2][3] = {{10,20,30}, {100,200,300}};
            int (*arr)[3];

arr = arr2;
            
 }
arr[0][0] ~ arr[1][2] 로 값 접근이 가능하다.

7. int (*arr)[2][3]
 - arr은 3차원 배열의 주소를 저장하기 위한 포인터 변수로 행과 열의 개수가 [2][3]인 int형 3차원 배열의 주소를 저장한다. 포인터 변수이므로 4byte

사용 예)

#include<stdio.h>
void main()
{
     int arr3[2][2][3]={{{10,20,30,{40,50,60}},{{70,80,90},{100,110,120}}};
     int (*arr)[2][3];
   
     arr = arr3;
}
arr[0][0][0]  ~ arr[1][1][2]로 접근이 가능하다

8. int (*arr[2])[3]
 - 같은 변수를 배열로 2개 선언한 것이다. 배열요수 (arr[0], arr[1])은 열의개수가 [3]인 int형 2차원 배열의 시작 주소등을 저장한다.

int iarr1[2][3] = {{21,22,23}, {24,25,26}};
int iarr2[3][3] = {{31,32,33}, {34,35,36}, {37,38,39}};

arr[0] = iarr1;
arr[1] = iarr2;

이렇게 해서
arr1[0][0][0] ~ arr[0][1][2] 까지 iarr1이되고
arr[1][0][0] ~ arr[1][2][2] 까지 iarr2가된다..

9. int *(*arr)[3] - 2차원 배열의 주소를 저장하는 포인터

int n1 = 10, n2=20,n3=30,n4=40,n5=50,n6=60,n7=70,n8=80,n9=90;
int *iarr1[2][3] = {{&n1,&n2,&n3}, ,{&n4,&n5,&n6};
int *iarr2[3][3] = {{&n1,&n2,&n3}, {&n4,&n5,&n6}, {&n7,&n8,&n9}};
int *(*arr)[3];

arr = iarr1; //여기서는 arr이 iarr1의 값에 *arr[0][0] ~ *arr[1][2]이렇게 접근가능..

arr = iarr2; //여기서는 arr이 iarr1의 값에 *arr[0][0] ~ *arr[2][2]이렇게 접근가능.. 배열은 주소를 저장하고있다.
10. int *func(); - int의 주소를 반환한다는 뜻..

#include<stdio.h>
int n =20;
int* func()
{
    return &n;
}
void main()
{
   int *np;
   np = func();

   printf("%d %d\n", n, *np);
}

11. int (*func)()
#include<stdio.h>
int function1()
{
   puts("함수 1입니다.");
   return 1;
}
int function2()
{
   puts("함수 2입니다.");
   return 2;
}
void main()
{
   int (*func)();
   
   func = function1;
   printf("%d\n", func());
   func = function 2;
   printf("%d\n", func());
}
func는 포인터 변수로 4byte이며 함수의 주소를 저장한다.

12. int (*func[2])()
 - 함수의 주소를 저장하는 배열로 크기가 2라서 8byte(정수형)이며, 각배열의 요소 func[0] func[1]는 함수의 주소를 저장한다.
#include<stdio.h>
int function1()
{
   puts("함수 1입니다.");
   return 1;
}
int function2()
{
   puts("함수 2입니다.");
   return 2;
}
void main()
{
    int (*func[2])();
   
    func[0] = function;
    printf("%d\n",func[0]);
    func[1] = function;
    printf("%d\n", func[1]);
}





 
예전것/프로그래밍2009. 6. 23. 09:35

출력하고자 하는것
함수 호출 : 1
함수 호출 : 2
함수 호출 : 3

#include<stdio.h>

char* getstr();

void main()
{
 puts( getstr());
 puts( getstr());
 puts( getstr()); 
}

char* getstr()
{
 static int n = 1;

 char *x = "" ;

 printf("함수 호출 : %d", n++);

 return x;
}


 getstr함수에서 정적 변수를 선언해서 호출 할때마다 n이 증가하도록 함.

헷갈렸던것

char *x = ''; 이것은 에러가 난다. ''은 빈문자 '상수' 이기때문이다. 주소를 가리켜야한다. 그러기위해선 "" 를 써서 빈문자를 나타내는 주소를 가리키게한다.

char x = ""; (char x = '';은 상수이기 때문에 return 상수; 하는 꼴이다.)
하고
return &x 로 바꾸면 어떤 문제가 생길까?

-일단 char x= ""; 이렇게 선언한다는것 자체가 문제이다. 상수형 변수에 주소를 넣겠다는 생각인가.
이때 &x는 뭐 그냥 주소값인데 아무것도 의미하지않는다.



getstr함수에서 문자자체를 넘겨주는 방법을 생각할 수있겠다(printf없이..) 스트링함수의 append를 쓰면 될거같다...

예전것/프로그래밍2009. 6. 23. 00:22
#include<stdio.h>

int main()
{
    char *str;
    
    scanf("%s", &str);
    printf("%s\n", &str);
}

위 프로그램을 실행 했을때 돌아간다.
str이 포인터 변수이지만 scanf에서 &str로 그 변수 안에 값을 써버린다.
그래서 printf해도 값이 나오는것이다. 물론 abc같은 짧은 문자를 쓰면 오류가 안나는데 adlkfasjd;lkfjasd같이 길게 쓰면 오류난다. (동적이 아니다. 이건 정적이라고볼수 있겠다.)

이경우에 우리는 *str을 이용하기 위해서 malloc 이라는 함수를 사용한다. char *str이 아무것도 가르키고 있지 않기 때문에 현재는 쓰레기 값이다. 그래서 malloc함수를 이용해 어느 한곳을 지정해준다.

#include
int main()
{
char *p;
p = (char*)malloc(20);
scanf("%s", p);
printf("%s", p);
free(p);
return 0;
}


#include
int main()
{
char p[20];
scanf("%s", p);
printf("%s", p);
return 0;
}
포인터 변수는 말그대로 어떤 주소값을 가리키고 있다.
그리고, 이 주소값이 가리키는 메모리영역에는 scanf로 받아들인 데이터를
저장하기 위한 어느정도의 공간이 할당되어야한다.
메모리를 잡아주어야한다.