이번 프로그램은 패턴 매칭 프로그램입니다.
취약점이 존재하는 함수(strcpy, strcat, ...) 등을 db.txt에 작성하고 프로그램을 실행하면 특정 파일에 db.txt와 같은 텍스트가 있는지 파악해서 출력하는 기능을 수행합니다.
이를 통해 취약점이 있는 부분을 쉽게 파악하고, 취약한 부분을 보완할 수 있도록 지원하는 간단한 프로그램입니다.
파일 실행 시 db.txt 파일과 취약점을 찾고자 하는 파일이 한 디텍토리 내에 있어야 합니다.
또 프로그램 실행 시 취약점을 찾을 파일 이름을 argv[] 변수로 전달해야 합니다.
db.txt 예시입니다.
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 |
---|