재미있는 정규표현식 1회
Forensics 2010. 3. 17. 10:04 |1. 정규 표현식이란?
정규 표현식(Regular Expression)은 일정한 패턴을 이용하여 그 패턴에 맞는 텍스트를 찾거나 조작하는 데에 사용되는 문자열을 말합니다.
정규 표현식이 필요한 이유에 대해 알아 보기 위해 아래 예제를 살펴 보도록 하겠습니다.
위의 내용을 모두 나열하면 1 Grade Dorumugs Class, 1 Grade Matthew Class, 1 Grade Kayser Class, 2 Grade Dorumugs Class ...... 3Grade Matthew Class, 3 Grade Kayser Class로 총 9개의 문자열로 표현이 가능합니다.
Grade는 숫자를, Class는 문자열을 포함합니다. 위 9개의 문자열을 모두 검색하기 위해서 검색 도구에 9개의 문자열을 모두 입력한다면 검색 시간이 매우 많이 걸릴 것이며 경우의 수가 늘어나는 경우 그 시간이 기하급수적으로 증가할 것입니다.
정규 표현식을 이용하여 특정한 패턴을 [숫자] Grade [문자열] Class와 같이 만들 수 있다면 한 줄로 위의 9개의 경우를 모두 표현할 수 있습니다.
Grade의 경우 숫자로만 표시되어 1,2,3,6은 포함하고 C,D,K 등의 문자열이 포함될 수 없습니다. 따라서 검색을 위해서는 문자열이 아닌 숫자로만 표현이 가능하도록 지정해야 할 것입니다.
1 Grade 부터 6 Grade 까지 존재한다고 가정하는 경우 정규 표현식을 이용하여 [1-6] Grade 으로 표현할 수 있습니다. 여기서 사용되는 특수문자는 메타문자라고 하며 각각의 사용방법과 의미가 존재하며 다음 장에서 살펴 보도록 하겠습니다.
Class의 경우 [A-Za-z]+ 등으로 모든 문자열로 표시할 수 있습니다. 메타문자 +는 + 앞의 문자가 1회 이상 반복되는 것을 의미합니다. 따라서 [A-Za-z]+는 알파벳 대소문자로 시작하여 이 것이 1회 이상 반복 되어 즉 영문자로 이루어진 단어를 뜻하게 됩니다.
정규표현식은 찾고자 하는 문자열을 문서에서 찾을 때 사용이 많이 됩니다.
시스템 관리자나 네트워크 관리자는 특정 문자열 검색이나 로그에서 특정 텍스트를 추출해야할 경우에 정규 표현식을 자주 마주치게 됩니다. 보안 관리자의 경우 디지털 포렌직이나 침해 대응 업무를 할 때 정규 표현식이 많이 사용됩니다.
만 라인이 넘는 특정 파일에서 IP 주소만 찾는 다던가 URL 주소를 추출해야하는 경우하는 경우 정규 표현식 없이는 모든 라인을 모두 검사해야 원하는 결과를 얻을 수 있을 것입니다.
2. 메타문자
메타 문자는 정규 표현식 안에서 특정한 의미를 갖는 특수문자를 말합니다. 이 메타 문자를 이용하여 반복과 범위 등을 나타낼 수 있습니다.
주요 메타문자의 활용 방법을 알아보기 위해 아래의 예제를 살펴보도록 하겠습니다.
아래의 예제는 메타문자 [ . ]의 사용방법을 알아보기 위한 예제 입니다. [ . ]은 임의의 한 문자를 나타냅니다.
위 예제에 같이 정규 표현식 A.. 은 A로 시작하는 3글자의 문자열을 의미합니다. 메타문자 [ . ]는 모든 문자 1개를 나타내기 때문에 모든 문자가 포함될 수 있습니다. 따라서 A.. 는 A로 시작하는 Ahn, Age, Ask등을 나타냅니다.
다음 예제는 반복에 사용되는 메타문자 [ * ], [ + ], [ ? ], [ { } ] 등에 대해서 살펴보도록 하겠습니다.
먼저 메타문자 [ * ]는 정규 표현식에서 앞의 문자를 0회 이상 반복함을 의미합니다.
Ah* 을 사용하는 경우 h가 0회 이상 반복되는 경우를 나타냅니다. 따라서 A, Ah, Ahh, Ahh…. 등을 나타낼 수 있습니다.
메타 문자 [ + ]는 앞의 글자를 1회 이상 반복함을 의미합니다.
메타문자 [ ? ]는 앞의 문자가 1개 또는 0개가 포함되는 경우를 나타냅니다.
정규표현식 Ah?nLab은 따라서 h가 있거나 없는 경우를 포함하므로 AnLab과 AhnLab을 포함할 수 있습니다.
메타문자 { n }는 앞의 문자열이 n회 반복됨을 의미합니다.
{ 2 } 라는 메타문자는 앞의 문자를 두번 반복한다는 의미입니다. 앞의 [ . ]은 문자열 하나를 말하기 때문에 문자 2개가 올 경우를 나타내어 A _ _ Lab를 나타낼 수 있습니다.
메타문자 { a , b }는 앞의 문자열을 a회 ~ b회 반복함을 의미합니다.
위 그림의 { 2,3 } 메타문자는 앞의 문자값이 2~3회 반복 되는 의미입니다. 현재 [ . ]이 { 2,3 }앞에 있으므로 아무 문자열 2~3개가 들어오는 경우를 나타냅니다.
따라서 이 경우 A _ _ L a b, A _ _ _ L a b을 나타내어 AhnLab, AmenLab을 포함할 수 있습니다.
[ ^ ] 메타문자는 ^뒤에 표시된 문자열로 시작함을 의미하니다. 따라서 A로 시작하고 h를 포함하는 모든 문자열을 포함합니다. 위 예제에서 AhnLab과 Ah~ha~ 문자열이 포함됩니다.
메타문자 [ $ ] 는 앞의 문자로 끝나는 것을 의미합니다. 아래 예제와 같이 LAB$로 정규표현식을 사용하는 경우 $는 B에만 영향을 줍니다. 하지만 B앞에 LA을 포함해야 하므로 결국 LAB로 끝나야함을 의미합니다.
따라서 LAB로 끝나는 AhnLAB, KimLAB을 포함하며 KimBAB은 해당되지 않습니다.
다음은 메타문자 자체를 표현할 때 어떻게 표현해야하는지 알아보도록 하겠습니다. 메타문자 [ . ]는 한 개의 문자열을 나타냅니다. 하지만 . 자체를 표현하기 위해서는 메타문자 [ \ ]를 사용하여 \. 으로 표현하면 됩니다.
위의 패턴은 메타문자인 .을 쓰기위한 방법입니다 앞에 \문자를 넣고 메타문자를 넣으면 메타문자를 문자처럼 인식합니다. 다른 메타문자도 마찬가지로 메타문자 자체를 사용하기 위해서는 앞에 [ \ ]를 사용하면 됩니다.
아래 표는 기타 다른 메타문자 조합을 나타냅니다.
위의 표는 Perl에서 쓰이는 메타문자입니다. 사용자들이 주의해야 할 점은 각 프로그램마다 메타문자의 형식이 조금씩 달라진다는 것입니다. egrep에서 사용 가능한 메타문자가 perl에서는 사용이 불가능한 경우도 많습니다.
그러므로 메타문자를 사용할 때 해당 프로그램에서 지원하는 지 여부를 확인하고 사용해야 합니다.
3. 정규표현식 활용
정규표현식은 문자열 처리에 대한 능력이 탁월 합니다. 그러므로 파일의 내용을 보여주는 프로그램과 같이 사용하는 경우가 굉장히 많습니다. 파일의 내용을 확인 할 수 있는 프로그램은 아래와 같습니다.
이름 |
내용 |
strings |
실행파일이나 오브젝트 파일등을 문자열로 확인 |
cat |
실행파일이나 오브젝트 파일등을 문자열로 확인 |
type |
텍스트 파일의 내용을 확인 |
grep |
문자열을 검색할 수 있는 프로그램 |
Egrep |
문자열을 검색할 수 있는 프로그램 |
Strings와 cat 그리고 type은 파일을 읽어들어여서 문자열을 확인하는 프로그램이며 grep과 egrep을 같이 연동하여 사용자가 원하는 문자열을 가져올 수 있습니다. Command line창에서 파이프라인( | ) 으로 연동이 가능합니다. 연동화면은 아래와 같습니다.
E:\test>cat dorumugs.txt
dorumugs company
phone : 010-1234-1234
email : dorumugs@ahnlab.com
E:\test>cat dorumugs.txt | egrep email
email : dorumugs@ahnlab.com
위와 같이 dorumugs.txt파일에서 파이프라인을 써서 email이 쓰여진 문자열을 정상적으로 뽑아낸 것을 확인 할 수 있습니다. 이제 정규표현식을 써서 문자열 검색하는 것을 직접 확인 해보겠습니다.
호스트 이름: DORUMUGS-COM
OS 이름: Microsoft Windows XP Professional
OS 버전: 5.1.2600 Service Pack 3 빌드 2600
OS 제조업체: Microsoft Corporation
OS 구성: 독립 실행형 워크스테이션
OS 빌드 종류: Multiprocessor Free
등록된 소유자: dorumugs
등록된 조직:
Product ID: 76489-640-7954827-23292
원래 설치 날짜: 2009-12-21, 오전 9:09:14
System Up Time: 1일, 2시간, 53분, 23초
시스템 제조업체: Gigabyte Technology Co., Ltd.
시스템 모델: EP45-UD3R
시스템 종류: X86-based PC
프로세서: 프로세서 1개 설치됨
[01]: x86 Family 6 Model 23 Stepping 10 GenuineIntel ~2999Mhz
BIOS 버전: GBT - 42302e31
Windows 디렉터리: C:\WINDOWS
System 디렉터리: C:\WINDOWS\system32
부팅 장치: \Device\HarddiskVolume1
시스템 로케일: ko;한국어
입력 로케일: ko;한국어
표준 시간대: N/A
총 실제 메모리: 3,326MB
사용 가능한 실제 메모리: 2,250MB
가상 메모리: 최대 크기: 2,048MB
가상 메모리: 사용 가능: 1,992MB
가상 메모리: 사용 중: 56MB
페이지 파일 위치: C:\pagefile.sys
도메인: WORKGROUP
로그온 서버: \\DORUMUGS-COM
네트워크 카드: NIC 2개 설치됨
[01]: 1394 넷 어댑터
연결 이름: 1394 연결
DHCP 사용: 예
DHCP 서버: N/A
IP 주소
[02]: Realtek RTL8168C(P)/8111C(P) PCI-E Gigabit Ethernet NIC
연결 이름: 로컬 영역 연결
DHCP 사용: 아니오
IP 주소
[01]: 192.168.137.200
위 파일은 systeminfo를 텍스트로 저장한 문서입니다. 이 값에서 IP정보만 추출해 보도록 하겠습니다.
E:\test>cat systeminfo.txt | egrep .{1,3}\..{1,3}\..{1,3}\..{1,3}
[01]: 192.168.137.200
E:\test>strings systeminfo.txt | egrep .{1,3}\..{1,3}\..{1,3}\..{1,3}
[01]: 192.168.137.200
E:\test>type systeminfo.txt | egrep .{1,3}\..{1,3}\..{1,3}\..{1,3}
[01]: 192.168.137.200
위 그림은 egrep을 연동하여 systeminfo.txt에서 IP내역만확인 하였습니다. Cat과 strings와 type을 전부 사용하여 결과값을 확인 하였습니다. 결과값은 다르지 않지만 각자 사용하는 방법이 조금씩 다르므로 궁금한 사용이 있을 경우 매뉴얼 페이지를 참조하시기 바랍니다.
정규표현식 2회에서는 포렌직에서 활용이되는 접근방법을 소개하도록 하겠습니다. 좀더 분석에 도움이 되는 스크립트를 보여드리며, 분석 진행과정을 단축 시킬 수 있는 팁을 간단히 소개하도록 하겠습니다.
'Forensics' 카테고리의 다른 글
x-way forensic으로 파일 복구하기 (0) | 2010.09.24 |
---|---|
정규표현식 2회 (0) | 2010.04.05 |
쓸만한 무료 웹 스캐너 Skipfish (0) | 2010.04.05 |
ASP Webshell (0) | 2010.03.18 |
F-response 설명서 (0) | 2009.09.11 |