이번 프로그램은 패턴 매칭 프로그램입니다.


취약점이 존재하는 함수(strcpy, strcat, ...) 등을 db.txt에 작성하고 프로그램을 실행하면 특정 파일에 db.txt와 같은 텍스트가 있는지 파악해서 출력하는 기능을 수행합니다.


이를 통해 취약점이 있는 부분을 쉽게 파악하고, 취약한 부분을 보완할 수 있도록 지원하는 간단한 프로그램입니다.


파일 실행 시 db.txt 파일과 취약점을 찾고자 하는 파일이 한 디텍토리 내에 있어야 합니다.

또 프로그램 실행 시 취약점을 찾을 파일 이름을 argv[] 변수로 전달해야 합니다.


db.txt 예시입니다.

strcpy
strcmp


testfile 예시입니다. (이 문장안에 strcmp나 strcpy가 적혀 있는데 문장내에 있는 각 단어를 찾아줍니다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Lorem ipsum strcpy dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation strcmp
ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in
voluptate velit strcmp esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur strcpy adipisicing elit,
sed do eiusmod tempor incididunt ut labore et strcmp dolore magna aliqua.
Ut enim ad strcpy minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate strcpy
velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint strcmp occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.


코드는 C++로 작성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;
 
int main(int argc, char *argv[]) {
    if(argc != 2) {
        cerr << "usage error : <program name> <textfile>" << endl;
        exit(0);
    }
 
    vector<string> vulstr;
    ifstream db("db.txt", ios::in);
 
    if(!db) {
        cerr << "file open fail - db file" << endl; exit(0);
        string line;
        while(getline(db, line)) vulstr.push_back(line);
        db.close();
 
        ifstream tar(argv[1], ios::in);
        if(!tar) {cerr << "file open fail - target file" << endl; exit(0);}
        size_t line_count = 0;
        while(getline(tar, line)) {
            ++line_count;
            for(size_t i=0; i<vulstr.size(); i++) {
                size_t found = line.find(vulstr[i]);
                if(found != string::npos) {
                    cout << "[1:" << line_count << ", pos:" << found << "]" << endl;
                    for(size_t j=0; j<line.size(); j+= 100) {
                        cout << "\t" << line.substr(j,100<< endl;
                        if( j <= found && found < j+100) {
                            cout << "\t";
                            for(size_t k=0; k<found%100; k++cout << " ";
                                cout << "^" << endl;
                        }
                    }
                    cout << endl;
                }
            }
        }
        tar.close();
        return 0;
    }
}



'학교 수업 및 과제 > 컴퓨터 보안' 카테고리의 다른 글

1. ALZip Fuzzing Project  (0) 2018.05.29

[UNIX 시스템 프로그래밍 second Edition - KEITH HAVILAND저] 연습문제 풀이입니다.


(저작권에 저촉 될 우려가 있어 문제 내용은 생략합니다.)


연습문제 3.10 입니다.

선택한 파일이 변경되는지 여부를 파악하여, 변경 될 때 표준출력으로 파일의 내용을 출력하는 프로그램입니다.

먼저 파일의 변경 여부를 확인하기 위해 파일의 최종 변경 시간을 가져옵니다.

이후 파일의 최종 변경 시간이 갱신되었다면 이때 표준 출력으로 파일의 내용을 출력하게 됩니다.

코드를 보면 더 쉽게 이해할 수 있을것이라 생각합니다.


코드는 C++로 작성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
 
#define BUFF_SIZE 1000
 
void slowwatch(const char*, time_t);
struct stat sb;
 
int main(int argc, char* argv[]) {
    int j;
    int fd;     
    time_t last_time;
    
    if(argc < 2) {
        fprintf(stderr, "usage : lookout filename ...\n");
        exit(1);
    }
    
    if(--argc > 1) {
        fprintf(stderr, "lookout : too many filenames\n");
        exit(1);
    }    
    
    fd = open(argv[1], O_RDWR | O_CREAT, 0644);
    fd = close(fd);
 
    if(stat(argv[1], &sb) == -1) {
        fprintf(stderr, "lookout: couldn't stat %s\n", argv[j]);
        perror("stat");
        exit(1);
    }
    last_time = sb.st_mtime;    
        
    for(;;) {
        slowwatch(argv[1], last_time);
        sleep(3);
    }    
}
 
void slowwatch(const char *name, time_t last) {
    if(stat(name, &sb) == -1 || sb.st_mtime != last) {
        printf("%s changed\n", name);
        char buff[BUFF_SIZE];        
        int fd;
        ssize_t rd_size;
        if0 < (fd = open(name, O_RDONLY))) {        
            while0 < ( rd_size = read( fd, buff, BUFF_SIZE-1))) {
                buff[rd_size] = '\0';
                puts(buff);        
            }
            close(fd);
        }
        else
            printf("file open fail\n");
 
        exit(1);
    }
}
 



[UNIX 시스템 프로그래밍 second Edition - KEITH HAVILAND저] 연습문제 풀이입니다.


(저작권에 저촉 될 우려가 있어 문제 내용은 생략합니다.)


연습문제 3.8 입니다.

이번 문제의 경우 사용자가 unlink를 사용하며 파일을 제거하는 프로그램을 작성하는 것이 목표입니다.

먼저 사용자가 파에 쓰기 권한을 가졌는지 확인하기 위해 access 함수를 이용하였습니다.

이후 쓰기 권한을 가졌다면 unlink 함수를 이용하여 파일을 삭제하였습니다.


코드는 C++로 작성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
 
int main(int argc, char *argv[]) {
    int check = 0;    
    if (argc !=2) {
        fprintf(stderr, "delete only one file\n");
        exit(1);    
    }
    if(access (argv[1], W_OK) == -1) {
        perror("cannot write");
        printf("\tyou don't have write permission.\n\tDo you want really delete file?\n\tif you want, input 1 : ");
        scanf("%d",&check);
        if(check == 1)
            printf("OK. delete file\n");
        else {
            printf("file delete cancel\n");
            exit(0);    
        }
    }
    if(unlink(argv[1]) == -1) {
        perror("unlink failed");
        exit(1);    
    }
    
    printf("Succeeded\n");
    exit(0);
}
 



[UNIX 시스템 프로그래밍 second Edition - KEITH HAVILAND저] 연습문제 풀이입니다.


(저작권에 저촉 될 우려가 있어 문제 내용은 생략합니다.)


연습문제 3.7 입니다.

특정 파일의 권한을 바꾸기 위해 ls스타일로 권한 명령을 내리면 변환해 주는 프로그램입니다.

ls스타일을 이용하기 위해 연습문제 3.3 에서 작성한 코드를 이용하였습니다.

변환 과정은 연습문제 3.3과 거의 같으며 실제 권한 변경을 수행하기 위해 chmod 함수를 이용했습니다.


코드는 C++로 작성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
char oc[4= "";
 
int lsoct(char* ls) {
    int check = 0;
    for(int i=0; i<=8; i++) {
        switch(ls[i]) {
            case 'r':
                check += 4;
                break;
            case 'w':
                check += 2;                
                break;
            case 'x':
                check += 1;                
                break;
            case '-':
                break;
            default:
                printf("signal error\n");
                return -1;            
        }
        
        if(i%3 == 2) {
            char c[1= {check+48};
            strcat(oc,c);
            check = 0;
        }
    }
    return 0;
}
 
int main(int argc, char* argv[]) {
    if(argc != 3) {
        printf("error : not two factor\n");
        return -1;
    }
    else if(strlen(argv[2]) == 9)
        lsoct(argv[2]);
    else if(strlen(argv[2]) != 4) {
        printf("error : file permission\n");
        return -1;     
    }
    else
        strcpy(oc, argv[2]);
    
    long i = strtol(oc, 08);
    if(chmod(argv[1], i) == -1)
        perror("call to chmod falled\n");
 
    return 0;
    
 
}


[UNIX 시스템 프로그래밍 second Edition - KEITH HAVILAND저] 연습문제 풀이입니다.


(저작권에 저촉 될 우려가 있어 문제 내용은 생략합니다.)


연습문제 3.6 입니다.

주어진 화일에 대해 읽기, 쓰기 또는 수행접근 여부를 확인하기 위해 access 함수를 이용했습니다.

코드를 보면 쉽게 이해할 것이라 생각합니다.


코드는 C++로 작성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
void whatable(char* filename) {
    if(access (filename, R_OK) == -1)
        perror("cannot read ");
    else
        printf("%s readable, proceeding\n", filename);
    
    if(access (filename, W_OK) == -1)
        perror("cannot write ");
    else
        printf("%s writeable, proceeding\n", filename);
 
    if(access (filename, X_OK) == -1)
        perror("cannot execute ");
    else
        printf("%s executable, proceeding\n", filename);
}
 
int main(int argc, char* argv[]) {
    if(argc == 2)
        whatable(argv[1]);
    else {
        printf("error : no filename or many filename\n");
        return -1;    
    }
    return 0;
}
 
cs