파일자르기

split -C 1024000 install.log

 - install.log 파일을 1메가 한도내의 줄단위로 자른다.

split -b 10240 install.log install_

 - install.log 파일을 10키로바이트 단위로 접두어 install_로 자른다.

각 계정에 적용되는 vim 설정파일은 각 계정 폴더의 .vimrc 파일이다.
만약 없을 경우 만들어 주면 된다. (없다는것은 별로 설정할 것이 없어서 존재하지 않는것임)

즉, 어떤 계정이든지 vi ~/.vimrc를 입력하면 각각의 계정의 vim 설정파일을 설정할 수 있다.

전체 계정의 vimrc를 설정하고 싶은 경우에는,

vi /etc/vimrc를 수정하면 된다. (숨김 속성이 아니다.)




만약 .vimrc에서 syntax on이 적용되지 않는 경우에는

현재 사용하는 vi가 vim이 아니라고 생각하면 된다.

따라서, 다음과 같은 과정을 거친다.





.bashrc 파일에 추가

alias vi=vim



# source .bashrc    (재접속 하지 않고 적용)


.vimrc 파일에 추가

syntax on



다음에 vi로 코드를 열게 되면, 컬러가 나오게 된다.

이거 찾는라고 많이 고생했다... 쩌비...



'도서관 I > 리눅스' 카테고리의 다른 글

[펌] eggshell.c 코드  (0) 2008.11.14
[펌] 대용량 파일 자르기  (0) 2007.08.22
[바람이] 리눅스에서 주로 사용하는 명령어 사용법  (0) 2007.08.02
[바람이] vi 사용법 정리  (0) 2007.08.01
[펌] gcc 명령어  (0) 2007.07.26
안녕하세요? 바람돌이입니다.
리눅스에서 주로 사용하는 명령어를 몇개 정리해보았습니다.
순서는 중요도와 관련이 없습니다.



1. wget
# wget [option] [URL]
 80번 (HTTP) 포트가 열려있는 상태에서의 파일을 받아오기 위한 명령어.
 일반적으로 웹브라우저에서 특정 파일을 클릭해 내 컴퓨터로 받아오는 것과 동일한 기능을 한다.
   -b : 용량이 큰 파일을 받을 경우 back ground로 수행시켜줌
   -i [filename] : filename에 받아올 파일 목록을 저장한다음, -i옵션을 주게 되면, 여러파일을 한번의 명령으로 받아올 수 있다.



2. ls
# ls [option] [path]
 path에 해당하는 목록을 옵션에 맞게 출력한다.
 path는 생략할 수 있으며, 생략시 현재 폴더를 출력한다.
   -a : 숨김(.으로 시작하는) 속성의 파일도 출력함
   -l : 파일의 정보를 모두 보여줌 (생략시 기본적으로 파일이름만 출력)



3. cat
# cat [filename]
 filename을 Text 모드로 화면에 출력한다.
 주로 redirection과 같이 사용한다.
 ex) # cat a.txt b.txt c.txt > all.txt
         세 개의 파일을 하나의 파일로 내용을 합쳐줌



4. which
# which [option] prog_filename
 prog_filename의 이름을 가진 실행 프로그램의 위치를 찾아줌



5. du
# du [option] [path]
 디스크 사용 공간에 대한 정보를 출력함
   -s : 디렉토리의 크기를 보여줌
   -h : 사람이 보기좋게 MB 단위로 보여줌
 ex) # du -sh tmp
      tmp 폴더의 크기를 MB단위로 보기좋게 출력해줌
 cf) # df -h
      하드디스크의 남은 용량을 MB 단위로 보여줌

6. rm
# rm [option] [path]
 파일이나 디렉토리를 삭제해줌
   -R : recursive 하게 subdirectory까지 삭제함
   -f : 사용자에게 경고하지 않고 모두 지움
  만약 -Rf와 같은 옵션을 사용하게 되면, 주의를 필요로 한다. 실수하면, 되돌릴수 없는 상황이 될지도 모른다.



7. cp
# cp [option] [src] [dst]
 파일이나 디렉토리를 복사해줌
   -R : recursive 하게 subdirectory까지 모두 복사함
   -f : 사용자에게 경고하지 않고 모두 복사 (덮어쓰기시)


8. touch
# touch [filename]
 말 그대로 특정 파일을 건드려 줌
 만약 filename이 존재한다면, 해당 파일의 마지막 수정 시간을 현재 시간으로 갱신함
 만약 filename이 존재하지 않는다면, 빈 파일을 생성함



9. find
  파일을 찾아줌. 매우 중요함으로 잘 알아둘 것
   -name : 이름으로 파일 찾기
             ex) # find / -name "*.[ch]"
                   루트(/)에서 부터 *.c나 *.h의 모든 파일을 찾아줌
   -print : 찾은 파일을 화면에 출력
   -exec : 찾은 파일들에 순차적으로 대해서 shell 명령어를 수행시켜 줌
             ex) # find /tmp -name "*.txt" -exec rm {} \;
                   /tmp 폴더에서 모든 txt파일을 삭제해줌


10. tar
  압축과 해제를 해줌
   -c : 압축 파일을 새로 생성함
   -x : 압축 파일에서 부터 파일들을 압축 해제함
   -f [filename] : 주어진 압축 파일을 사용함
   -z : gzip을 통해 압축과 해제를 실행함


 
주로 사용하는 것들만 모았습니다. 다시 한번 말씀드리지만, 주로 사용하는 것입니다. 이것들만 알아도 유용하네요.
본 키워드들은 command state에서 입력해야합니다.

* 주의 : 대문자인 경우에는 shift를 누르고 입력합니다.
            Ctrl + x 는 Ctrl키를 누르고 x키를 누르라는 표시입니다.
            dd 처럼 연속된 문자는 그냥 연속해서 두번 누르라는 표시입니다.

1. 페이지 이동

Ctrl + f : 다음 페이지
Ctrl + b : 전 페이지
Ctrl + d : 반만 다음 페이지로
Ctrl + u : 반만 전 페이지로

2. 커서 이동

h : 좌
j : 아래
k : 위
l : 우

w : 커서를 바로 다음 단어로 이동
b : 커서를 바로 전 단어로 이동

3. 복사

y : 특정한 다음 텍스트를 복사
yy : 커서가 있는 라인을 복사
p : 삭제나 복사된 텍스트를 커서가 있는 문자나 라인 뒤에 삽입

4. Undo Redo

u : Undo
. : Redo

5. 검색

/[pattern] : /를 누르면 왼쪽 하단에 '/'가 표시되고 패턴을 입력가능함
                 이때 패턴을 입력하면 해당 패턴을 찾아줌
n : 위에 패턴으로 찾은 여러개 중 다음으로 일치하는 패턴을 찾음 (다음찾기)
N : 위의 패턴으로 찾은 여러개 중 이전으로 일치했던 패턴을 찾음 (이전찾기)

6. 삭제

x : 현재 커서에서 한 문자 삭제 (뒤에것을 당김)
dd : 현재 커서가 있는 라인 삭제 (아래 줄을 당김)

*gcc 버전 확인
gcc -v

*gcc로 컴파일

gcc로 컴파일할 파일명
ex)gcc test.c
a.out이라는 실행 파일이 생김
./a.out으로 파일 실행

*gcc로 실행파일 지정 컴파일
gcc -o test test.c

*gcc로 컴파일만 하고 링크하지 않기
gcc -c test.c

*두 개 파일을 부분 컴파일 후 링크시키고 실행
gcc -c a.c b.c
gcc -o a a.o b.o
./a

*헤더파일
헤더파일 중에 <>로 묶인 것과 ""로 묶인 것이 있다.
<>로 묶인 것은 /usr/include에서 파일을 검색하고,
""로 묶인 것은 현재 디렉토리 및 -I옵션을 준 디렉토리에서 헤더파일을 찾는다.
gcc a.c -I..
gcc a.c -I/usr/src/linux/include

-t 묶음 파일의 내용을 표시하는 옵션
ar t libc.a | less

정적 라이브러리 : a라는 확장자
공유 라이브러리 : so라는 확장자

라이브러리 만들기

ar r libtest.a test.o
-s 옵션 : 목차를 갱신하거나 생성해줌
ar s libtest.a
ar rs libtest.a test.o

라이브러리 사용
gcc -o test test.c -ltest
gcc -o test test.c -ltest -L.

-l옵션 뒤에 링크하고 싶은 라이브러리 이름을 써줌
라이브러리 파일의 이름에 공통적으로 붙는 lib는 빼주고, '.'을 포함한 확장자도 빼준 나머지를 씀
수학라이브러리인 libm.a를 링크하고 싶을 때는 -lm 과 같은 옵션을 붙여야 함

gcc의 기본 라이브러리 디렉토리
/lib, /usr/lib, /usr/local/lib

*도움말 man

ex) man errno
man -s 2 write (섹션 지정하는 옵션)

*에러 처리

#include <string.h>
char *strerror(int errnum);

#include <stdio.h>
void perror(const char* msg);

사용

#include<errno.h>
fprintf(stderr, "ERROR: %s\n", strerror(errno));
perror("error");

-출처 : 영진닷컴 Unix & Linux C programming

안녕하세요? 바람돌이입니다.

Fedora Core 4에서는 보안을 이유로 계정으로 접속을 하고 디렉토리에 권한을 설정한다고 하여도 업로드를 불가능하게 해놓았습니다.
물론 로그인, 다운로드는 잘 동작합니다.

drwxrwx---  15 root root     4096  7월 25 22:52 .

다음과 같게 권한이 설정되어있어야 합니다.

drwxrwx---  15 test test     4096  7월 25 22:52 .

이렇게 되어 있어도 됩니다.
아무튼, 중요한 것은 해당 디렉토리에도 로그인 한 계정에 대한 쓰기 권한이 있어야만 업로드가 된다는 것입니다.
자세한건 "리눅스의 권한 설정" 부분과 "chmod"를 살펴보시기 바랍니다.



그리고, 업로드를 가능하게 하려면, 다음을 실행합니다.

[root@localhost ~]# setsebool -P ftpd_disable_trans 1

정확하게 어떤 것인지는 모르지만, 위와 같이 실행하면, 업로드가 가능해집니다.
물론, 위를 실행한뒤에는 vsftpd를 재시작해주어야만 합니다.

[root@localhost ~]# /etc/init.d/vsftpd restart



반대로 다시 업로드기능만을 막고 싶다면
다음과 같이 실행합니다.

[root@localhost ~]# setsebool -P ftpd_disable_trans 0
[root@localhost ~]# /etc/init.d/vsftpd restart


꼭 성공하시기 바랍니다. 몇일 고생했습니다. 안될 이유가 없다고 맨날 생각해서리... @^-^@

'도서관 I > 리눅스' 카테고리의 다른 글

[바람이] vi 사용법 정리  (0) 2007.08.01
[펌] gcc 명령어  (0) 2007.07.26
[바람이] killproc-2.11 사용법  (0) 2007.07.20
[펌] 리눅스 한글 깨짐 현상 해결법  (0) 2007.07.18
[펌] ctags & cscope 설치 및 사용  (1) 2007.07.02

출처:

Study on Race Condition - Seoro Lee : 2002-01-25
http://khdp.org/2004/wiki/doc/Race_Condition



1. 머리말

 

유닉스는 멀티 유저를 지향한 매우 훌륭한 시스템이다. 여러 사람으로 하여금 정보를 공유할 수 있도록 잘 만들어져 있다. 그러면, 개인의 Privacy는 어떤 식으로 유지가 되는 것일까? 그것은 Permission, 그리고 password 등으로 가능하도록 구현해 놓았다. 그리고, 시스템 관리를 위해서 Root라는 superuser를 두어서 어떤 일이든 가능한 위치에 놓았다.


초기에 유닉스가 나타난 당시, 사용하는 유저가 그리 많지 않았고, 또한 흑심을 품은 해커도 별로 나타나지 않았으므로, 보안에 관한 관심이 별로 없었다.


그러나, 요즈음의 경우 사용자 편의를 위해 짜여진 프로그램이 거꾸로 시스템을 공격하는 무기고가 되고 있다. 일반 유저가 프로그램의 버그를 이용하여 갑자기 관리자의 권한을 지니고 권력(?)을 휘두르는 사태에 이르렀다.


해커들이 localhost에서 관리자의 권한을 잡는 방법은 여러가지가 있으나, 아직까지 크게 알려지지 않은 이 race condition을 이 문서에서 다루어 보도록 한다.



2. race condition이란?

 

race condition이란, 해킹조건을 뜻하는 말이 아니었다. race condition은 간단히 말해서, 두 프로세스간에 resource를 사용하기 위해서, 다투는 과정이다. 그 단적인 예를 여기에 하나 보인다.


------ race condition EXAMPLE 1 ----------------
void main(void)
{
        int     childpid;
        int     a, b;
        if((childpid = fork()) > 0) { /* Parent process */
                for(a = 0; a < 100; a++) printf("O");
                exit(0);
        }
        else { /* child process */                             
                for(b = 0; b < 100; b++) printf("X");
                exit(0);
        }
}
------------------------------------------------


fork()라는 함수는 동일한 작업을 하는 프로세스를 하나 더 띄우는 함수이다. fork()를 호출할 때, 그 return값은 새로 만들어진 프로세스의 번호가 되는데, 그것으로 두 프로세스를 나눌 수 있게 된다. (자세한 것은 system prog책을 참조하시오) 그러면 위에 Remark를 보인 것 처럼 원래의 프로세스는 O라는 문자를 찍게되며, 자식으로 나온 프로세스는 X를 찍는다.


물론 각각 100번을. 이때, 유닉스는 Time Sharing을 사용하므로, 프로세스 마다 시간을 각각 할당하게 되는데, 어느쪽에 시간을 더주느냐 덜주느냐가 문제가 된다.


그냥 생각하기로는 OXOXOX... 이런 식으로 나오리라 생각할 수도 있지만, 실행해보면 OOOXXOOXXXXXXOOXOXX 이런 식으로 얽혀서 주기성이 없이 나타난다. 이것이 바로 race condition이라는 것이다.



3. Symbolic Link

 

유닉스에는 Symbolic link라는 아주 좋은 개체가 존재한다. 일반적으로 어떤 파일을 접근하고자 할때, 그것의 Full-path를 찾아가는 일은 대단히 귀찮은 일이다. 물론 PATH라는 좋은 매체가 존재하기는 하나, 그것으로는 조금 불충분하다고 생각할 수 있다. symbolic link는 그냥 path name으로 연결해주는 매체로써, 예를 드는 것이 가장 쉬울 것으로 예상된다.


당신이 시스템내에서 /home/project/AI/SIM 이라는 디렉토리에서 연구를 한다고 하자. 당신의 login디렉토리는 /user/iam이라고 하자. 당신은 그쪽으로 연구를 하러 갈때 항상 cd /home/project/AI/SIM 과같은 방식으로 갈 수 밖에 없을 것이다. 그것도 매일같이 한다면 더욱 귀찮을 것이다. 이런 경우 symbolic link를 이용하면 매우 간단히 해결된다.


당신의 홈 디렉토리에서 'ln -s /usr/project/AI/SIM .link' 라고 입력하면, ".link"라는 링크 파일이 만들어 진다. 그러면 차후에 cd .link라고 입력하면 .link는 /home/project/AI/SIM으로 연결되어 있으므로, 자동으로 그쪽 디렉토리로 이동하게 된다. 매우 편리한 기능이다.


Symbolic link는 위와 같이 매우 편리하게 이용할 수 있으나, 위험성을 많이 내포하고 있다. 유닉스에 존재하는 일반적인 버그에 수시로 나타나는 것이 바로 이 Symbolic link인데, 왜 그런지 그 이유를 살펴보도록 한다.


예를 들어서, 어떤 프로그램이 hello라는 파일을 열어서, 그곳에 무언가를 써준다고 가정한다. 이때 만약 당신이 Permission이 된다면, hello라는 파일을 지우고나서, symbolic link로 'ln -s ~xxx/.rhosts hello' 라고 해두면 어떻게 되겠는가? 그 프로그램이 실행되면 hello라는 파일을 여는데, hello는 ~xxx/.rhosts라는 파일에 링크되어 있으므로, 그 프로그램은 ~xxx/.rhosts를 열어서 쓰게 된다. (물론 잘만 프로그램을 짜면 그런 일을 없앨 수 있다.)


이러한 단적인 예제가 elm 에 존재하는 autoreply라는 버그였는데, 그것은 setuid root되어 있고, /tmp에 arep.???? 라는 666 mode의 파일을 생성한다. 그러면, 그 생성되는 파일을 없애고(unlink), symbolic link를 /.rhosts(root의 .rhosts)로 연결시켜버린다. 그러면 실행하면서 /.rhosts라는 파일에 "+ +"정도가 들어가게 하기만 하면, 만사 OK(or BAD?)가 된다.



4. Why race condition APPEAR?

 

위와 같다면 왜 race condition이 등장하게 되었을까? 그냥 링크시켜서 하면 되는 것인데, 왜 프로세스 간의 resource경쟁이 나타나는가? 그것은 일종의 방어자와 공격자의 싸움에서 등장한 결과라고도 볼 수 있다.


프로그래머는 드디어 위와 같은 autoreply의 문제점을 인식하고, 새로운 방법을 모색하게 되었다. 그것은 바로 lstat()를 이용한 것으로, lstat()을 이용하여, 먼저 modify하고자 하는 파일이 Symbolic Link인지를 먼저 파악하고 그런 후에 그 파일을 open()시켜서 처리하도록 한것이다. 정말 혁신적인 방법으로, 아무런 문제가 없는 듯이 보였다. 그러나, 여기에서 race condition이 등장한다.


lstat()과 open()사이에는 분명히 갭이 존재한다. 그 갭을 적절히 이용한 것이 바로 race condition인데, 먼저 race프로그램을 background로 돌린다. race 프로그램은 돌면서, 공격하고자 하는 프로그램이 modify하는 파일을 연속해서 지우고, 링크를 만들고 하는 작업을 반복한다. 그런 후에 공격하고자 하는 프로그램을 돌린다. 그러면 어떻게 되는가?


lstat()이 이루졌을때, unlink()가 되어있고, open()될때 symbolic link가 되어 있다면, lstat()은 무용지물이 되고 만다. 그러나, 그것이 이루어 질지 안 이루어 질지는 미지수이다. 위에서 얘기한 것 처럼 프로세스는 어떻게 시간을 할당할지 전혀 알 수 없기 때문이다. 그러므로, race condition이라 불리운다.


여기까지 설명을 했으니, 여기 내가 간단히 짜놓은 예제를 보인다. 이것은 SunOS의 sendmail(/bin/mail)의 버그를 설명하는 것이다.


------- race.c --------------------------------
-------------------- race ---------------------
#include &ltsys/types.h>
#include &ltfcntl.h>
void main(void)
{
        while(1) {
                unlink("./tmp.file");
                symlink("./.rhosts", "./tmp.file");
        }
}
-----------------------------------------------


이것은 race를 위해 돌릴 프로그램이다. 공격하고자 하는 프로그램이 현재 디렉토리에 "tmp.file"이라는 이름의 파일을 변경한다고 할 때, 만들어 놓은 것이다. "tmp.file"지우고, 그후 다시 현재 디렉토리의 ".rhosts"에 링크하고하는 작업을 반복시키고 있다. 실행 파일 명은 race이다.


---- victim.c ---------------------------------
------------------------ xx -------------------
#include &ltsys/types.h>
#include &ltsys/stat.h>
#include &ltfcntl.h>
main()
{
        struct stat buf;
        char *name = "./tmp.file";
        char *data = "+ +\n";
        int     fd;
        int     is_link;
        int     i;
        if(lstat(name, &buf)) {
                printf("File does not Exist.\n");
                fd = open(name, O_WRONLY|O_CREAT, 0644);
                write(fd, data, strlen(data));
                now_ok();
                close(fd);
                exit(0);
        }
        else {
                printf("File does EXIST!\n");
                printf("Now This file is a ");
                if((is_link = S_ISLNK(buf.st_mode)) ) printf("link\n");
                if(S_ISREG(buf.st_mode) ) printf("regular file\n");
                if(is_link) {
                        printf("THIS IS SYMBOLIC LINK. DIE MAN\n");
                        exit(0);
                }
                fd = open(name, O_WRONLY | O_APPEND);
                write(fd, data, strlen(data));
                now_ok();
                close(fd);
                exit(0);
        }
}
now_ok()
{
        printf("Now ok is Appended.\n");
}
--------------------------------------------

victim.c는 공격하고자 하는 프로그램의 간단한 예제이다. 꽤 길어졌는데, 그것은 그 과정을 확실히 보이기 위함이다.


이 프로그램은 시작할 때, 먼저 lstat()을 이용, 파일이 존재하는지 안하는지를 체크한다. 없으면, open에서 O_CREAT 옵션을 이용하여, 파일을 생성하고 data를 "+ +"을 넣는다. "+ +"은 유별난 데이터지만 sendmail의 경우, 마음대로 data를 바꾸어서 넣을 수 있으므로, "+ +"을 넣었다고 가정한다.


파일이 존재하면 lstat으로 부터 얻은 정보를 이용해서, symbolic link인지 아닌지를 체크한다. symbolic link이면 이 프로그램의 의도에 맞게 대응할 수 있다. 그렇게 않으면 일반 파일이므로, 내용을 추가하여 넣는다.


이제 이 두 프로그램의 race를 지켜보기 바란다. 여기 실행 결과를 Capture한 파일을 보인다.


---------- Captured File ---------------------
Script started on Wed Aug 21 02:19:24 1996
[moses:/u4/norther/seoro] 1 cat ./.rhosts
nowhere nobody
[moses:/u4/norther/seoro] 2 race &
[1] 6519
[moses:/u4/norther/seoro] 3 xx
File does EXIST!
Now This file is a link
THIS IS SYMBOLIC LINK. DIE MAN
[moses:/u4/norther/seoro] 4 xx
File does not Exist.
Now ok is Appended.
[moses:/u4/norther/seoro] 5 cat ./.rhosts
+ +
ere nobody
[moses:/u4/norther/seoro] 6 xx
File does EXIST!
Now This file is a link
THIS IS SYMBOLIC LINK. DIE MAN
[moses:/u4/norther/seoro] 7
script done on Wed Aug 21 02:20:11 1996
---------------------------------------------

자 옆에 달린 1,2,3.. 번호를 따라가본다.


1번에서 먼저 .rhosts에 들어있는 파일을 보았다. "nowhere nobody"라는 데이터가 들어 있다.


2번에서 race &로 돌려 background로 계속해서 tmp.data를 지웠다가 링크하는 과정을 반복하고 있다.


드디어 3번에서 목표 프로그램을 실행해본다. 파일이 존재하며, 그것이 symbolic link임이 드러난다. 이것은 race할때, unlink()하여, 파일을 없앤 순간이 아니라, symbolic link를 연결한 순간에 lstat()에 걸려서 나타난 현상이다.


4번에서 다시 시도한다. 이번에는 파일이 없으며, 내용을 넣는다고 나타났다.


5번에서 .rhosts내용을 확인해본 결과, 아닌게 아니라 "+ +"메시지가 들어가있다.


6번에서 한번 더 해보았지만 실패하고 만다.


매우 확실한 예제로 이정도면 race가 왜 등장하게 되었는지 알 수 있으리라고 생각한다. 이제 실제 예로 몇가지 예를 설명한다.



5. Some Examples

 

[1] SunOS sendmail(/bin/mail)

SunOS의 sendmail은 외부로 부터 온 메일을 받아서 그것을 /var/spool/mail/$USER 위치에 넣는다. $USER라는 표기는 그냥 온 유저에 맞도록 넣는다는 의미이다. 문제는 그 유저의 permission으로 넣어주기 위해서(chown) Root권한으로 프로그램이 돌아간다는 사실이다.


/var/spool/mail의 디렉토리가 777로 열려있다고 가정한다. 이때, /etc/passwd에는 entry가 존재하고, /var/spool/mail에는 아직 존재하지 않는 유저가 있다고 생각해보자. ftp, sundiag등 mail이 날아올 일이 없는 id가 분명히 있을 것이다. 이런 경우 race condition으로 시스템에 구멍이 생긴다.


ftp를 지목하였다고 하자. race 프로그램을 만든다. 그것은 /var/spool/mail/ftp를 지웠다가 그 파일을 'ln -s /.rhosts /var/spool/mail/ftp'로 링크하는 것을 반복하는 것이라고 생각한다. 이제 race프로그램을 돌린다. 그런 후에, ftp로 아주 적절한 data를 넣어서 메일을 보낸다. 그러면 어떻게 되는가?


sendmail은 4장에서 소개한 방법으로 Symbolic link를 판별한다. 그러므로, 확률이 반반정도로 위의 예처럼 잘 걸린 경우 그 내용이 /.rhosts에 들어가든지 unlink()되어 파일이 없었던 경우라면, ftp라는 파일이 생성되고 결말이 날 것이다.


[2] Solaris 2.x ps(/usr/bin/ps)

여기부터는 간략히 그 메카니즘만을 설명하기로 한다. Solaris 2.x에 있는 ps는 /tmp 디렉토리에 임시파일을 만들고, 그 파일에 내용을 쓴 다음 chown()을 이용하여, 권한을 바꾸고 마지막으로 그것을 /tmp/ps_data라는 파일로 rename시켜준다.


이것은 어떤 방법으로 race condition이 가능한가?


이번의 race프로그램은 약간 신경을 써서 만들어야 한다. 임시로 만들어지는 파일의 이름이 무엇인지 알지 못하므로, 이런 경우에는 race프로그램에서 계속해서 /tmp디렉토리를 search해가면서 나타나는 파일마다 race를 걸어주어야 하게 된다.


search하면서 파일이 나타나면, 그것을 unlink()시키고, 그다음 그것을 우리가 원하는 파일에 링크한다. 그 후 그 파일을 chown()시키므로, 우리가 원하는 파일의 permission이 바뀌게 된다.


[3] Misc

/usr/ucb/lpr            임시 파일이 1000을 주기로 이름이 반복된다.
                              lpr -q -s 옵션을 이용 원하는 파일에 symbolic link가능

/bin/passwd -F       패스워드 변경시 /etc/ptmp라는 파일을 생성, 내용을
                              바꾼후에, /etc/passwd에 overwrite시킨다.

/usr/lib/sendmail     보낸 user가 존재하지 않는 경우, /var/tmp/dead.letter에
                              Guessing가능한 파일이 생성된다.



6. 대책

 

race condition, 또는 symbolic link에 의한 대책은 여러가지가 있을 수 있다.


첫째, 가능한한 임시 파일을 만들지 않는 것이다.

요즈음 시스템이 비대해지면서, 어느정도는 메모리 내에서 처리가 가능하다. 굳이 임시 파일을 만드는 것은 race condition의 원인이 된다.


둘째, unlink()를 불가능하게 한다.

unlink()를 시키지 못하면, symbolic link가 만들어 지는 것은 불가능하다. 위의 Solaris의 ps버그는 /tmp가 0777모드로 다른 유저가 /tmp의 파일을 modify가능하기에 나타난 버그이다. 이런 경우 /tmp를 1777로 sticky를 붙이게 되면, unlink()가 불가능해진다.


셋째, creat()와 open()의 구분을 확실히 한다.

이것은 /bin/mail의 경우 확연한 것으로 만들고자 하는 파일을 계속 지웠다가 링크를 만들었다가 하므로, 결국 공격을 당할 시에는 두가지 경우만이 존재한다. symbolic link이거나, 정말로 존재하지 않거나 두가지이다. 그러므로, lstat()에서 파일이 존재하지 않은 것으로 판명된 경우는 open()시킬 때, 옵션을 O_WRONLY|O_CREAT으로 주는 것이 아니라, 여기에 O_EXCL을 첨가하여, 만일 어떤 식으로든 파일이 존재하는 경우, 파일 생성 또는 쓰기를 포기하게 하는 것이다.


넷째, umask를 최하 022정도 유지한다.

파일이 생성되는 경우, 기본 permission이 666으로 누구나 와서 쓸 수 있다. 이에 umask를 이용하면, permission이 mask되어 나와서, 다른 유저의 write permission을 없애준다.

그외에도 많이 있을 수 있겠으나, 이정도로 간단히 정리하도록 한다.



7. 결론

 

이하 race condition에 대해서 다루었다. UNIX시스템에서 이렇듯 시스템 프로그램에 얼마든지 버그가 존재할 수 있으며, 여기에 대해 적극 대처하는 것이 필요하다.

여기까지 race conditon을 일단(!)마치고, 점차적으로 내용을 늘려나가기로 한다.


--------------------
Seoro Lee, Miso Tech
--------------------



안녕하세요? 바람돌이입니다.

이번에 설명할 프로그램은 killproc 으로서 리눅스에서 프로세스를 PID가 아닌 프로세스 이름과 같은 것으로 죽일 수 있는 프로그램입니다.

먼저 http://rpmfind.net/ 이나 그 외에 다양한 곳에서 다운을 받을 수 있습니다.

본 페이지에서도 2.11 버전은 다운 받으실 수 있습니다.



우선 해당 파일을 적당한 곳에 다운 받습니다.
그리고 나서, 다음과 같이 압축을 해제합니다.

[root@localhost ~]# tar zxvf killproc-2.11.tar.gz
killproc-2.11/
killproc-2.11/README
killproc-2.11/COPYING
killproc-2.11/Makefile
killproc-2.11/killproc.8
killproc-2.11/killproc.c
killproc-2.11/startproc.c
killproc-2.11/startproc.8
killproc-2.11/checkproc.c
killproc-2.11/checkproc.8
killproc-2.11/libinit.c
killproc-2.11/libinit.h
killproc-2.11/usleep.c
killproc-2.11/usleep.1
killproc-2.11/killproc-2.11.lsm
[root@localhost ~]#

그리곤 해당 폴더에 들어가서 make를 실행하면 실행 파일이 생성됩니다.


[root@localhost ~]# cd killproc-2.11
[root@localhost killproc-2.11]# make
gcc     -D_GNU_SOURCE -Wall -pipe -funroll-loops -DINITDIR=\"/etc/init.d\" -c libinit.c
gcc     -D_GNU_SOURCE -Wall -pipe -funroll-loops -o killproc killproc.c libinit.o
gcc     -D_GNU_SOURCE -Wall -pipe -funroll-loops -o startproc startproc.c libinit.o
gcc     -D_GNU_SOURCE -Wall -pipe -funroll-loops -o checkproc checkproc.c libinit.o
gcc     -D_GNU_SOURCE -Wall -pipe -o usleep usleep.c
[root@localhost killproc-2.11]# ll
합계 372
-rw-r--r--  1  223 ftp  18007 11월  8  2005 COPYING
-rw-r--r--  1  223 ftp   4544 11월  8  2005 Makefile
-rw-r--r--  1  223 ftp    983 11월  8  2005 README
-rwxr-xr-x  1 root root 29103  7월 20 17:04 checkproc
-rw-r--r--  1  223 ftp   7511 11월  8  2005 checkproc.8
-rw-r--r--  1  223 ftp   7149 11월  8  2005 checkproc.c
-rwxr-xr-x  1 root root 32245  7월 20 17:04 killproc
-rw-r--r--  1  223 ftp    749 11월  8  2005 killproc-2.11.lsm
-rw-r--r--  1  223 ftp   8631 11월  8  2005 killproc.8
-rw-r--r--  1  223 ftp  10373 11월  8  2005 killproc.c
-rw-r--r--  1  223 ftp  33820 11월  8  2005 libinit.c
-rw-r--r--  1  223 ftp   9341 11월  8  2005 libinit.h
-rw-r--r--  1 root root 21868  7월 20 17:04 libinit.o
-rwxr-xr-x  1 root root 38672  7월 20 17:04 startproc
-rw-r--r--  1  223 ftp   7806 11월  8  2005 startproc.8
-rw-r--r--  1  223 ftp  16992 11월  8  2005 startproc.c
-rwxr-xr-x  1 root root  5917  7월 20 17:04 usleep
-rw-r--r--  1  223 ftp   1024 11월  8  2005 usleep.1
-rw-r--r--  1  223 ftp   1724 11월  8  2005 usleep.c
[root@localhost killproc-2.11]#


보시는 것 중에 killproc 파일이 바로 실행 파일입니다. (특정 터미널에서는 색상이 다르게 보일겁니다.)

이를 PATH를 설정해주어도 되지만, 편하게 계속 사용할 것임으로 /bin 폴더에 복사해 놓습니다.



[root@localhost killproc-2.11]# cp ./killproc /bin
[root@localhost killproc-2.11]# killproc
killproc: Usage:
        killproc [-v] [-t<sec>] [-g|-G] [-SIG] /full/path/to/program
        killproc -l
[root@localhost killproc-2.11]#



그리곤 실행을 시켜보면 어느 폴더에서나 위와 같이 실행이 가능하다는 것을 알 수 있습니다.




사실 make를 하게 되면 3개의 프로그램이 생성됩니다.
1. startproc
2. checkproc
3. killproc

즉, 프로세스를 생성하고, 검사하며, 죽일 수 있는 패키지입니다.
나머지에 대한 것은 검색을 활용하시기 바랍니다.




간단한 killproc 사용법을 설명하겠습니다.
만약 mysqld를 실행하면, 대략 몇개의 프로세서가 동작하게 되는데,

[root@localhost killproc-2.11]# killproc mysqld

하게 되면, mysql에 관련된 프로세서가 모두 죽는 것을 볼 수 있습니다.


스크립트에 넣어서 사용하시는 것도 하나의 팁이 될 수 있겠네요. @^-^@




출처 : 삽질신 님의 네이버 블로그
원문 : 리눅스 한글 깨짐 현상 해결해보자


한글이 깨지는 현상이 있을 경우 /etc/sysconfig/i18n 의 설정은 아래와 같았음

LANG="ko_KR.UTF-8"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"
SYSFONT="latarcyrheb-sun16"


이부분을 아래와 같이 수정~~~


# 한글 설정
/etc/sysconfig/i18n

LANG="ko_KR.eucKR"
SUPPORTED="en_US.iso885915:en_US:en:ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16"
SYSFONTACM="iso15"



# 매뉴얼 설정 수정
vi /etc/man.config

수정
PAGER          /usr/bin/less -isr    ( --> 이부분은 안해도 한글설정됨!! )


수정후 바로적용하고 싶다면 "source /etc/sysconfig/i18n " 하면된다.

위 두가지 한글 설정은 터미널이나 기타부분에서 한글깨짐현상을 고치기 위해서다

출처 : 쿠마님 네이버 블로그
원문 : ctags & cscope 설치 및 사용



1. ctags 란 ?

   = >  ctags는 프로그래밍 소스 코드의 태그 (전역변수 선언, 함수 정의, 메크로 정의)들의
          데이터 베이스(tags파일)을 생성하는 명령어입니다.
          커널 소스 분석등 작업에서 탁월한 성능을 발휘합니다

2. ctags 버전 확인하기

    = > (쉘에서)  $ctags --version 이라고 입력한다 설치 돼어 있는경우 버전 정보가 나옵니다
    cannat commond find  => 깔려 있지 않을시 에러 출력
    ( 대부분 기본리눅스에서 디폴트로 깔려 있지 않을것이다 처음 설치시 전체 설치 또는..
      선택 설치로 ctags를 설치 한경우라면 몰라도 디폴트로는 거의 안깔려 있습니다.
      특히 ubuntu 의 경우 원래 데스크탑용으로 개발 돼고 있어서.. 개발 툴이 하나도 안깔려 있기
      때문에 별또 설치를 필요로 합니다 )

3. ctags 설치하기
    => ubuntu 의 경우 레드헷 이나 페도라 등 다른 리눅스에 비해 비교적 쉽게 설치할수 있습니다
        레드헷일 경우 rpm 버전을 따로 다운 받아 설치 해야 하는 방면 데비안 계열 명령어
        apt-get으로 간편하게 설치가 가능합니다

    ubuntu 설치 하기
      (쉘에서) $apt-get install  ctags  (자동으로 최신 버전으로 설치 됩니다 )

    redhat 설치하기 http://sourceforge.net/projects/ctags (rpm 버전을 다운 받은후)
        (쉘에서) $rpm -ivf 다운받은 rpm 파일명 (으로 설치 하실수 있습니다)

    설치 완료 후 2번 과정 버전을 확인 하면 버전 정보가 재대로 나오면 재대로 설치가 되었습니다.
    레드헷 일 경우 lib.so 에러가 발생할수 있는데 버전이 안맞는 것을 깔면.. 설치가 재대로
    돼지 않는 문제점이 발생합니다 위 링크에서 최신버전 5.6.1 의 경우 페도라 5 용 이므로
    레드헷일 경우 5.0 버전 이나 찾아보시고 하위 지원 돼는 버전을 설치 해야 합니다..
    확인 결과 5.0.1 은 재대로 설치가 가능하더라고요..

4. tags 파일 만들기
    = > 우선 커널이 있는 폴더로 이동 합니다
           $cd /usr/src/linux/ <== ( 전 linux로 심볼릭 링크가 돼어 있습니다 안돼어 있다면
           심볼릭 링크를 만드셔도 돼고 직접 경로를 다 입력 하셔도 상관없습니다)
           심볼릭 링크 만들기 -> ln -s  /usr/src/커널폴더명 linux
           커널 폴더로 이동했으면 ctags -R 을 입력하여 tags 파일을 생성합니다
           시간이 좀 걸리는데 ls로  tags 파일이 생성 된걸 확인 합니다

          $cd /usr/include 폴더로 이동 합니다
           마찬가지로 ctags -R 명령으로 include 폴더도 tags 파일을 생성 합니다
           정상적으로 파일이 생성 되었다면 다음 단계로 넘어갑니다

5. ctags 설정 하기
    = > 설치 가 완료 되고 tags파일이 생성 되었다면 작업이 거의 끝난거나 마찬 가지 입니다.
           매번 vi 에서 ex모드 에서 입력하는거도 한계가 있으므로 .vimrc 파일에
           tags 를 설정 해두는게 편합니다
           vimrc 파일에 다음 라인을 입력 한후 저장합니다
           set tags=./tags,/usr/src/linux/tags,/usr/include/tags
           (linux 의 경우 심볼릭 링크 한경우)  직접 폴더를 입력 하신분은 경롱에 맞게 설정 합니다


사용하기         
=====================================================
여기 까지 했다면 설치 및 설정은 완료 되었습니다..

이제 사용 하는거만 남았는데
복잡하게 책에는 여러 옵션이 많지만 보통 잘안쓰는 옵션들은.. 거의 쓸일이 없고..
자주 쓰는 것만 다루겠습니다.

ex 모드 -> vi 에서 : 을 눌러서 명령을 입력 하는 모드를 말합니다
ex 모드에서 :tj 함수명 이나 구조체명 (왜 tj 인가 ?  tags jump 약어)
(찾고자 하는 함수명이나 구조체 이름등을 입력 하면 관력 이름 함수나 구조제..정보가 나타 납니다 )
보통 한두가개 아닌경우 스페이스바를 누르면 목록이 더나오며 d 를 누를 경우 한페이지씩..
보여 줍니다 나갈때는 q로 나갈수 있습니다 그럼 <CR> 이 나오는데 여기서 찾은 함수나 구조체
번호를 입력 하면 자동으로 점프합니다

다른 방법으로 가는 방법은 커널 소스를 vi열어서 분석하다가 함수 원형이나 구조체 이름에서
ctrl + ] 를 누르면 자동으로 태그를 찾아 갑니다
이전으로 다시 돌아 올때는 ctrl + t 를 사용 해서 돌아 올수 있습니다

ex모드 : sts 함수명 , 구조체명
위에서 설명한 tj와 비슷 하지만 한가지 다른점이 수평창분활을 해서 결과를 보여 줍니다

이외 명령이 더 있지만 실제 이거만 알아도 충분 합니다 나머지 이전으로 돌아가기 이런건..
거의 실제 사용 되지도 않습니다 위에 설명한 4가지 방법이 주로 쓰는 방법입니다.


[tip] 헤더 파일 바로 읽어 오기

#include <linux/kernel.h> <- 헤더파일 이름에 커서를 위치 한후

Ctrl + wf 를 누르면 창이 수평 분할되어 헤더파일이 열립니다


====================================================



cscope 를 이용한 2%로 채우기
    ctags만으로도 커널소스와 소규모 프로젝트롤 분석하는데 부족함은 없지만..
    2%로 부족한게 있다 ctags만으로는 지역변수나 전역변수가 사용된곳 은 찾기가 힘들다
    이때 cscope 사용하면 됩니다

cscope 설치 하기
    ubuntu = > $apt-get install cscope 로 간단히 설치 할수 있다 (데비안 계열의 강점)
    redhat
    (다운 로드)
    wget http://belnet.dl.sourceforge.net/sourceforge/cscope/cscope-15.3-1.i386.rpm
    설치 하기
    $rpm -ivf cscope-15.3-1.i386.rpm

cscope 설정 하기
  
cscope 설정은 좀 손이 많이 갑니다 (ctags에 비해...)
    우선 mkcscope.sh 파일을 만들어야 합니다
  ============ mkcscope.sh 파일 내용 ================
    #!/bin/sh
    rm -rf cscope.files cscope.files

    find . \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name

    '*.S' \) -print > cscope.files
    cscope -i cscope.files
    ============================================
    파일 생성 후 파일 퍼미션 설정
    $chmod 755 mkcscope.sh
    $mv mkcscope.sh /usr/bin
    디렉토리 이동
   
$cd /usr/src/linux (심볼릭 링크 아닐시 전체 경로)
    mkcscope.sh 실행  하면 빌드 돼면서 데이터가 만들어 집니다
    빌드 종료시 값을 입력 하는게 나오는데 ctrl + d를 눌러서 종료 합니다.
   
    이후 .vimrc 파일에 다음 내용을 추가 합니다
    =============================================
    set csprg=/usr/bin/cscope
    set csto=0(숫자 0)
    set cst
    set nocsverb

    if filereadable("./cscope.out")
       cs add cscope.out
    else
       cs add /usr/src/linux/cscope.out
    endif
    set csverb
   ==============================================
   이제  설정은 끝이 났습니다

   사용하기 ( cscope 의 명령 형식 )
    :cs find {질의종류} {심벌}
    ex) cs find s start_kernel

  
cscope 의 질의 종류
    0 or s  - > Find this C symbol
    1 or g  - > Find this definition
    2 or d  - >
Find functions called by this function
    3 or c  - > Find functions calling this function
    4 or t  - > Find assignments to
    6 or e  - > Find this egrep pattern
    7 or f   - > Find this File
    8 or i   - > Find files #including this file


cscope 를 활용 함으로써 더 완벽히 커널소스를 분석할수 있지만 ctags 만 사용하는거 보다
cscope 를 같이 사용 하니까 찾는데 시간이 더 오래 걸리는거 같네요..
.vimrc 파일에서 cscope 세팅 부분을 주석으로 해두고 사용하다가..
더 깊게 찾을 필요가 있을때 사용 하는게 더 편할듯 싶은데..
그냥 설정 된 체로 ctrl + ] 를 남발하면  ctags만 있을때는 더이상 찾을게 없으면
그냥 위치에서 멈처 있는데 cscope 가 세팅 돼어 있다면 계속 해서  파일을 검색해서
검색하는데 시간이 좀 걸려서..^^;; 거슬릴때가 있네요..

정리 할겸 만들어 봤는데 생각보다 시간이 오래 걸리는듯..
해보시고 안돼는거 있으면 댓글 달아 주세요..


기존 내용에서 추가 된 부분입니다..

Tlist 내용이 빠져서 다시 수정합니다..

뭐 크게 달라지는 내용은 없고요.. Tlist 가 먼지 모르는 분도 있을테니까요..

간단하게 Tlist 를 설명하지면 TagList 약자로써.. 이름에서 설명하는거 처럼..

해당 파일의 정의된 함수명,변수(#define), 등을 이름으로 효율적으로 보여주는 유틸리티 입니다.

ctag & cscope 와 연동해서 사용하면 무척 효율적이죠..

말로 설명하는게 감이 안오시는분은.. Visual C++에서요 Cpp 확장자로 작업하시면..

클레스 별로.. 함수 이름이 나와서 관리 할수 있잖아요.. 그거랑 똑같다고 보시면 돼요..

관련 문서는 인터넷에서 검색하면 쉽게 찾을수 있고요..

못찾겠다 싶은 분들은 제 게시판에 잘설명된게 있어서 퍼와서 올려 뒀어요.. 참고하세요..^^

http://blog.naver.com/ikariksj/140026617491




=== 2차 수정부분 === [ 2006/09/21 ]
mkcscope.sh 파일 생성시  띄워쓰기 주의를 하지 않으면..
문제가 발생하는게 확인 돼었습니다..
한줄로 붙여서 쓰면 보기 불편해서 두줄로 짤라뒀는데..
그부분을 그대로 복사해서 붙여 넣으면 오류가 발생하네요..
물론 직접 코딩하는거면 띄위쓰기 주의하면서 하면 괜찮은데..ㅎ
작성된지 좀됀문서인데도 요즘도 간간히 스크랩 돼는걸 보면..
필요하신분을이 있을지 모르니.. mkcscope.sh 를 새로 첨부 해둘께요..


참 노파심에 한말씀 드린다면 네이버에서 블로그 자료 올리면 자동으로 아이이가..
붙게 돼는데 받은 파일에서 아이디 부분을 지워야 합니다..
mkcscope.sh 로 변경해서 사용하세요..

+ Recent posts