목적: 
프로그래밍을 하다보면 printf문을 사용해서 보기 편하게 출력해야할 일이 생기기 마련이죠. 
스페이스바나 탭기호를 넣어서 어렵게 하지 마시고, 
printf문의 다양한 출력 형식을 활용하면 쉽게 가능합니다. 


알아봅시다:

1. 좌,우 정렬
출력되는 자료를 어느 방향으로 정렬할 것인지를 결정해 줍니다.
(-)부호를 앞에 붙이면 왼쪽 정렬이 됩니다. 

당연히 아무것도 붙이지 않으면 오른쪽 정렬이 되구요. 


평소에는 쓸 일이 없겠지만.. 아래 형식에 따라 이쁘게 줄을 맞출때 유용합니다. 



2. 다양한 출력 형식

%c : char(문자)형의 한 문자로 출력(그냥 '%c'로만 사용하시기 바랍니다.)
%d : 부호 있는 정수로 출력
%o : 부호 없는 8진수 정수로 출력
%x : 부호 없는 16진수 정수로 소문자 출력
%X : 부호 없는 16진수 정수로 대문자 출력
%u : 부호 없는 정수로 출력
%f : float나 double형의 실수로 출력
%e : 과학 기술 계산용(예 : 1e5 = 100000)으로 e를 소문자로 출력
%E : %e와 비슷하나 E를 대문자로 출력
%g : %f나 %e중 짧은 것으로 선택
%G : %f나 %E중 짧은 것으로 선택
%s : 문자열 출력('\0'을 만날 때 까지 계속 출력합니다.)
%p : 포인터의 주소를 hex값으로 출력
%% : '%'를 그대로 출력(그냥 '%%'로 사용하시기 바랍니다.)


3. 출력할 최대 자릿수 지정

자리가 모자라면 그냥 무시하고 계속 출력하고
자리가 남으면 나머지를 공백(정수,문자열) 혹은 0(소수점 유효숫자 이하)으로 채웁니다.

※ 주의 : 실수의 경우에는 소수점까지 포함한 전체 자릿수를 말합니다.

예) 123을 %5d로 출력하면 -> __123 ( _는 공백)
123.456를 %10f로 출력하면 -> 123.456000
"ASDF"를 %10s로 출력하면 -> ______ASDF


4. 최대 출력 폭(길이)과 문자 수를 구분(문자열)

.(점) 을 이용해서 구분해 줄 수 있습니다. 
소수점 이하 자릿수를 구분(실수)해 줍니다.

예) 123.456789 를 %10.3f로 출력하면 -> ___123.457 (반올림 됨) 



5. 소수점 이하 자릿수(실수)나 출력할 문자 수(문자열) 
.(점) 이후에 숫자로 지정해줍니다. 

출력할 0의 갯수(정수)를 지정할 때도 사용됩니다.

실수 출력인 경우에는 출력할 자릿수만 소수 이하로 출력되며
문자열의 경우에는 맨 앞부터 출력할 문자수만큼 출력합니다.

예) "ASDF"를 %.2s로 출력하면 -> ___AS
1.23456789 을 %.3f로 출력하면 -> 1.235 (반올림 됨)
123을 %.12d로 출력하면 -> 000000000123


6. long형으로 출력

실수, 정수형에서만 사용이 가능한 옵션입니다. 
(long형은 double, long double, long, unsigned long을 말합니다.)



다양한 예제:


1. "ASDF"라는 문자열

%s : ASDF
%10s : ______ASDF
%-10s : ASDF______
%10.3s : _______ASD
%-10.3s : ASD_______


2. 123.456789 라는 실수 

%f : 123.456789 
%.3f : 123.457 (반올림 됨)
%10.3f : ___123.457
%-10.3f : 123.457___
%10.3E : _1.235E+02
%-10.3E :  1.235E+02_

3. 123 라는 정수

%d : 123
%5d : __123
%05d : 00123 
%.5d : 00123 (%05d와 같은 의미)
%-5d : 123__
%x : 7b
%5x : ___7b
%-5x : 7b___
%05x : 0007b
%-5X : 7B___
%o : 173
%07o : 0000173
%-7o : 173____
%7o : ____173


Posted by KT한
,

가변인자 함수

1. 가변인자 함수 설명 
 va_list
가변 인자들의 시작 주소를 저장하는 자료형
 va_start
가변 인자의 시작 주소를 va_list 형의 변수에 저장하는 매크로
 va_arg
가변 인자를 접근하는 매크로
 va_end
가변 인자 시작 주소를 NULL로 설정하는 매크로


2. 가변인자 함수의 제약

하나 이상의 고정 인자를 필요로 한다.
va_arg()를 이용하여 접근하는 가변인수는 순차적으로만 접근 가능하다.
정확한 자료형으로 접근하는 것은 전적으로 사용자의 몫
가변인수의 목록은 원형이 없기 때문에 가변인수로 전달되는 값은 인수 확장이 발생한다. (argument promotion)
int 형보다 작은 
char, short -> int
float ->  double
인수 확장이 일어난 인수는 va_arg()로 접근할 때 확장된 자료형으로 접근해야 한다.


3. 필요 라이브러리 
 #include <stdarg.h>


예제 


1. 메크로 선언


디버깅 메시지를 호출하는 파일, 함수, 위치에 정보를 넘겨주기 위한 메크로 함수
그리고, 디버깅 메시지에 색깔을 주기 위한 컬러 프린트 메크로 함수
 
#define DebugPrint(n, fp, ...) \
                   DebugPrintFunc(n, fp, __FILE__, __func__, __LINE__, __VA_ARGS__)

#define cprintf(color,fmt, args...) ({ \
        printf(color fmt ANSI_FG_NC, ##args); \
        })


2. 실제 함수 선언


int DebugPrintFunc(int , const char* , const char* filename,
          const char* funcname, int line,  const char *, ...);



3. 실제 함수 정의

    
int DebugPrintFunc(int run_level, const char* thread, const char* DebugFile, 
                  const char* DebugFunc, int DebugLine,  const char *errorMsg, ...)
{
    char buf[STD_BUF+1];
    va_list ap;

    va_start(ap, errorMsg);
    vsnprintf(buf, STD_BUF, errorMsg, ap);
    buf[STD_BUF] = '\0';

    cprintf(YELLOW,"[FATAL_ERROR] %s:%s:%d:%s",
                 DebugFile, DebugFunc, DebugLine, buf );

    va_end(ap);
}



4. 함수 호출 

DebugPrint(DEBUG_ERROR, thread_name, "Alloc Fail..Not Enough Memory\n");


Posted by KT한
,

함수 포인터 란?

C언어의 포인터가 데이터의 위치를 가리키는 대신 함수 포인터는 함수를 가리키는 것입니다. 

포인터는 세그먼트 폴트를 유발하는(?) 단점이 있지만, 잘 활용한다면 C언어만의 장점이 됩니다. 


사용 용도 및 활용 방안:

Generic 함수를 만들어서 사용 및 관리가 용의하게 코딩이 가능합니다. 

또한, 범용 함수기 때문에 코드에 대한 이해도를 높히는 부가적인 효과도 있습니다. 




자.. 그럼 어떻게 사용해야 하는지 알아봅시다. 


이해를 돕고자 같은 녀석들 끼리 같은 색을 칠해두었습니다. 


1. 함수를 호출할 이름을 정의 함.


#define DEFINE_FUNC_NAME      "func_name"             



2. 함수 포인터 선언


함수 이름을 포인터 타입으로 해야 합니다. 

그리고, 괄호로 묶는 위치도 신경써야 합니다. 


typedef int (*OptFunc)(int argument1, char *argument2);



3. 실제로 호출 될 함수 정의 


위에서 선언한 함수에 의해 실제로 호출 될 함수 입니다. 


static int  FuncName(int argument1, char *argument2)

{

...

}



4. 함수 포인터 구조체 정의 

예제로 이름, 변수, 함수 세가지만 정의했습니다. 
실제 사용할 때 기본이 되는 구조입니다. 

typedef struct _OptFunc

{

    const char *name;

    int arg;

    OptFunc func;

} FuncPointer;



5. 함수 포인터 구조체에 값 설정 

함수를 여러개 설정 해서 사용할 것이므로 배열로 잡아줍니다. 
위에서 정의한 구조체의 순서에 따라 name, arg, func에 각각 매핑 됩니다. 

다시 말해서..
name 은 DEFINE_FUNC_NAME으로 설정 해줍니다. 즉, "func_name"이 되겠죠
arg는 1 로 설정 해줍니다. 
func는 FuncName을 가리키게 되겠죠. 

static const FuncPointer options[] =
{
    {  DEFINE_FUNC_NAME, 1, FuncName },                 
    { NULL, 0, 0, NULL }   
};


6. 함수 호출  

함수 포인터에 정의된 함수를 찾아서 Argument와 함께 호출 합니다. 

toks[0]가 "func_name"이면 FuncName 함수가 호출 되는 구조입니다. 
즉, 입력을 받아 특정 함수만 호출 하도록 구현하시면 됩니다. 

for (i = 0; options[i].name != NULL; i++)
{
 if (strcasecmp(toks[0], options[i].name) == 0)              
{
options[i].func(argument1, argument2);                   
}
}


Posted by KT한
,

Boyer-moore 문자열 탐색 알고리즘은 Robert S. Boyer와 J Strother Moore에 의해 1977년에 개발되었다. 

알고리즘의 컨셉은 패턴을 뒤에서부터 비교하여 탐지하는 것이 특징이다. 


Boyer-moore 알고리즘은 크게 다음 두 가지 방식의 탐지 방식을 사용하고 있다.

두 가지 방식 중 더 큰 값만큼 이동하면서 패턴 매칭을 시도하게 된다. 


1. bad character method 

주로, 문자열이 매칭되지 않았을 때 많이 이동 할 수 있는 알고리즘. 
character set인 256만큼의 배열을 잡아서 패턴 길이 값으로 초기화를 시켜준다. 

이후 패턴의 앞 부터 한자씩 읽어 가면서 해당 배열값에 마지막 글자까지의 값으로 설정
예를 들면, 아래 문장의 가장 처음 'A'의 경우, 'A'는 10진수 65이다. 
그러므로, 배열의 65번째 값에 'A'와 패턴의 끝인 'N' 와 7글자 떨어져 있으므로 7을 넣어준다. 
이와 같은 방식으로 A->N->P->A->N->M->A를 처리한다. 만약, 동일한 문자가 나오면 마지막 글자와 가까운 위치에 탐지를 해야할 문자가 있는 것이므로 해당 값을 덮어쓰게 된다.  (마지막 글자 N은 떨어진 거리가 0이므로 제외)
그 결과 아래 표와 같은 결과를 얻을 수 있다. 

예) ANPANMAN 

CharacterShift
A 1
M 2
N 3
P 5
all other characters 8

2. good-sufix method 
주로, 문자열이 매칭된 경우 많이 이동할 수 있는 알고리즘. 
입력받은 패턴을 가지고 최대 이동 값을 미리 계산해둔다. (문자열 길이만큼의 배열)

최대 이동값을 계산하는 방식은 아래 표와 같다.  

i는 현재 패턴을 매칭하기까지 매칭에 성공한 문자 개수이다. 
pattern에서 취소선이 그어져 있다면, 해당 문자는 매칭이 되지 않음을 의미한다. 
Left shift는 왼쪽으로 얼마만큼 이동할지를 의미한다. 
(최종적으로 배열에는 i + left shift 값으로 설정해주게 된다. )

예) ANPANMAN 

iPatternLeft Shift
0 N
오른쪽 끝 문자가 N이 아닌 문자만큼 왼쪽으로 이동.
오른쪽 두번째 문자가 A이므로, 한 칸 이동한다. (만약 'ANPANMNN'이라면 두 칸 이동하게 된다. ) 
1
1 AN AN 은 ANPANMAN에 더이상 나오지 않는다. 때문에, 패턴 길이 만큼 이동하게 된다.
8
2 MAN
 MAN 은 ANPANMAN  패턴에서 세칸 이동하면 찾을 수 있다.  
3
3 NMAN
 'NMAN' 은  'ANPANMAN' 에 더이상 나오지 않는다. 
하지만,  'NMAN' 은 6 칸 이동하면 또 나타난다.  
('NMANPANMAN')  = 6
4 ANMAN
'ANMAN'은 더이상 나오지 않는다. 하지만,'ANMAN' 은 6 칸 이동하면 나타난다.   
('ANMANPANMAN') = 6
5 PANMAN
'PANMAN'은 더이상 나오지 않는다. 하지만, ' PANMAN' 은 6 칸 이동하면 나타난다.    
('PANMANPANMAN')  = 6
6 NPANMAN
'NPANMAN'은 더이상 나오지 않는다. 하지만, ' NPANMAN' 은 6 칸 이동하면 나타난다.     
('NPANMANPANMAN')  = 6
7 ANPANMAN
'ANPANMAN'은 더이상 나오지 않는다. 하지만, ' ANPANMAN' 은 6 칸 이동하면 나타난다.      
('ANPANMANPANMAN')  = 6


  • 탐지 예제

 순번

 M

P

 1

A

       
 2  

 A

A       
 3    


- 순번 1: 패턴의 뒤에서부터 매칭을 시도 하면 문자열 ‘A’와 패턴 ‘N’이 같지 않으므로 이동을 해야 한다. bad-character method 와 good-suffix method모두 이동 값이 1 이므로 1칸만 이동.

- 순번 2: 뒤에서 ‘AN’이 매칭되었으므로, bad-character method에 의해 ‘P’의 이동 값이 5에서 ‘AN’ 두 문자만큼의 값을 뺀 3만큼 이동하게 된다. Good-suffix method에 의해서도 i가 2일 때 값이 3이므로 3만큼 이동하여 다시 매칭을 시도한다. 
- 순번 3: 원하는 문자열을 찾았다. 


Posted by KT한
,
정규표현식에 대해 생소한 분들은 초/중급 포스팅을 참고하세요. 
정규표현식 초급정규표현식 중급 


 여기서는 자주 사용되지는 않지만..
잘 알고 사용하면 여러가지로 유용한 내용들에 대해 다뤄보고자 합니다.

1. 단어 경계 - \b, \B 
 매칭하고자 하는 패턴의 단어 경계를 지정하는데 사용. 

단어의 경계를 찾는 '
\b'옵션을 사용하면
문자열 중 일부에만 매칭되는 경우는 제외하게 된다. 
====================================
  
표현식  \bart\b
  
문자열  The art of music part of artist
==================================== 

'
\B' 는  '\b'와 반대의 의미로 사용된다. 


2. 비 캡처 그룹 - (?: )
그룹화 기호를 사용해서 매칭을 시도할 경우 
매칭되는 내용은 캡처되어 추후에 재사용 할 수 있도록 한다. 

하지만, 재사용할 일이 없을 경우 
비 캡처 그룹으로 표현해주므로써 캡처 그룹에서 제외시키고,
적지만 성능 향상도 기대할 수 있다. 
====================================
  
표현식  (?:one|two|three)
==================================== 


3. 명명 재참조 - (?P<name>) , (?<name>)혹은 (?'name') 
특정한 패턴을 캡처한 후 이를 사용하기 편하도록 이름을 지어준 후
그 이름으로 캡처된 패턴을 불러다 사용.

캡처된 값들에 이름을 지정해주므로써 보는 사람 관점에서도 이해하기 쉽도록 도와주고, 
특정 위치의 값을 저장해두었다가 다른 위치에서 동일한 값이 나오는지 확인 하는데 유용함.

방식은 크게 세가지가 지원되며, 버전에 따라 지원되지 않는 것도 있을 수 있다. 
값을 캡처하고 명명 할 때와 이를 호출해서 사용 하는 방법은 다음과 같다. 

     명명              =>                 호출 
(?P<name>)        =>              (?P=name)     
(?<name>)
          =>             \k<name>
(?'name')            =>              \k'name'


 
====================================
  
표현식1  (?P<hour>\d\d):(?P<min>\d\d)-(?P=hour)-(?P=min)
  표현식2  (?<hour>\d\d):(?<min>\d\d)-\k<hour>-\k<min>
  표현식3  
(?'hour'\d\d):(?'min'\d\d)-\k'hour'-\k'min'

  
문자열  17:53-17-53
==================================== 


4. 주석 처리 - (?# ) 혹은 (?#>     <)

정규표현식에 설명을 추가하고 싶을 때 사용.
자칫 잘못 사용하면 복잡도가 증가하여 오히려 역효과를 불러 일이킬 수 있다. 

 
====================================
  
표현식  (?#year)\d{4}-(?#mon)\d{2}-(?#day)\d{2}
 

====================================
Posted by KT한
,
목적:
1. 웹 서버의 취약점을 사전에 검사해보고 기본적인 취약점을 보완함으로써 해커의 간단한 공격으로 부터 웹 서버를 보호
2. 웹 서버를 보호하는 보안 장비가 웹서버의 취약점을 스캔하는 행위를 정상적으로 탐지 하는지 검증

사용 절차:
1. nikto를 다운 받는다.
혹은 첨부된 파일을 받아도 됩니다.
(perl로 작성된 툴이므로 perl관련 라이브러리가 설치되어 있어야 한다.)
http://cirt.net/nikto2 

 

2. nikto 실행
타겟 호스트와 실행 옵션을 주고 실행
# ./nikto.pl  -h 66.66.66.11 -output result.html -Format html  -Cgidirs all

3. 세부 옵션 설정 
(괄호 안에 표기된 문자는 약자)
-config (c)      config 파일을 지정. 기본 설정값을 포함한 nikto.config 파일이 있으니 참고하면 된다.
-host (h)        스캔을 수행할 웹서버(호스트) 주소
-Cgidirs (C)    스캔할 CGI 디렉토리를 설정. 메뉴얼에 의하면 all을 권장함.
-output  (o)     결과를 출력할 파일 지정
-Single (S)      스캔을 한 개씩 옵션을 지정해주면서 수행. 단일 스캔을 수행 할 때 사용.  

자세한 설정은 '-H' 옵션으로 확인 가능하다.

결과 확인:
결과는 다음과 같이 화면에 출력된다.
---------------------------------------------------------------------------
+ Target IP:          66.66.66.11
+ Target Hostname:    cpe-66-66-66-11.rochester.res.rr.com
+ Target Port:        80
+ Start Time:         2011-08-18 01:00:00
---------------------------------------------------------------------------
+ Server: Microsoft-IIS/5.0
+ Retrieved x-powered-by header: ASP.NET
+ Retrieved x-aspnet-version header: 2.0.50727
+ Microsoft-IIS/5.0 appears to be outdated (4.0 for NT 4, 5.0 for Win2k, current is at least 7.5)
+ OSVDB-397: HTTP method 'PUT' allows clients to save files on the web server.
+ OSVDB-5646: HTTP method 'DELETE' allows clients to delete files on the web server.
+ Retrieved dasl header: <DAV:sql>
+ Retrieved dav header: 1, 2
+ Retrieved ms-author-via header: DAV
+ OSVDB-13431: PROPFIND HTTP verb may show the server's internal IP address: http://web-babo/_vti_bin/_vti_aut/author.dll
+ OSVDB-877: HTTP TRACE method is active, suggesting the host is vulnerable to XST
+ OSVDB-877: HTTP TRACK method is active, suggesting the host is vulnerable to XST
+ OSVDB-396: /_vti_bin/shtml.exe: Attackers may be able to crash FrontPage by requesting a DOS device, like shtml.exe/aux.htm -- a DoS was not attempted.
+ OSVDB-3092: /_vti_pvt/deptodoc.btr: FrontPage file found. This may contain useful information.
+ OSVDB-3092: /_vti_pvt/doctodep.btr: FrontPage file found. This may contain useful information.
+ OSVDB-473: /_vti_pvt/access.cnf: Contains HTTP server-specific access control information. Remove or ACL if FrontPage is not being used.
+ OSVDB-272: /msadc/msadcs.dll: See RDS advisory RFP9902, CVE-1999-1011, http://www.microsoft.com/technet/security/bulletin/MS98-004.asp, http://www.microsoft.com/technet/security/bulletin/MS99-025.asp RFP-9902 BID-29 (http://www.wiretrip.net/rfp/p/doc.asp/i2/d1.htm), CIAC J-054 http://www.ciac.org/ciac/bulletins/j-054.shtml www.securityfocus.com/bid/529
+ OSVDB-3092: /admin/: This might be interesting...
+ OSVDB-3092: /img/: This might be interesting...
+ OSVDB-3092: /test.txt: This might be interesting...
+ OSVDB-3233: /_private/: FrontPage directory found.
+ OSVDB-3233: /_vti_bin/: FrontPage directory found.
+ OSVDB-3233: /_vti_inf.html: FrontPage/SharePoint is installed and reveals its version number (check HTML source for more information).
+ OSVDB-3092: /Admin/: This might be interesting...
+ 6456 items checked: 6535 error(s) and 41 item(s) reported on remote host
+ End Time:           2011-08-18 01:02:09 (129 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

대부분의 결과가 OSVDB-xxx 라는 패턴으로 시작하는 것을 알 수 있다.
OSVDB는 The Open Source Vulnerability Database의 약자로 해당 홈페이지에서 자세한 내용을 확인 가능하다.


OSVDB(The Open Source Vulnerability Database) 홈페이지
http://osvdb.org/


1. 홈페이지 좌측 상단의 OSVDB ID Lookup칸에 nikto 수행 결과로 나온 값을 검색


2. 다음 주소의 id값만 바꿔서 바로 해당 내용을 조회 가는 것도 가능
http://osvdb.org/show/osvdb/3233


Posted by KT한
,
목적:
Http의 url에서 자주 사용되는 다양한 인코딩(encoding)에 대한 정리 

※내용은 중요하지 않고 인코딩된 패킷을 생성하고 싶으시다면 다음 포스팅을 참고하세요. 
http://kthan.tistory.com/46


내용:

 1.  Hex Encoding 
URL을 인코딩 하는 가장 간단한 방법 RFC 표준에 따른다.

예) %41 = 'A'  


 
2. Double Percent Hex Encoding
Microsoft IIS에서 지원한다. 
Hex Encoding에 기반하는 encoding방식으로..
'%25' 가 '%'를 의미하기 때문에 결국은 한번 꼬았다고 보면 된다. 

예) %2541 = 'A' 



3.  Double Nibble Hex Encoding
Microsoft IIS에서 지원한다. 
인코딩 할 값을 하나씩 나눠서 각각 인코딩을 한다. (nibble이란 단어의 의미를 곰곰히 생각해보면 이해하는데 조금 도움이 된다.)
'%34' 가 '4'이고 '%31'이 '1'을 의미하므로 각각을 디코딩 하면 결국 %41이 된다. 
 

예) %%34%31 = 'A'

 

4. First Nibble Hex Encoding  
Microsoft IIS에서 지원한다. 
바로 앞에서 다른 'Double Nibble Hex Encoding'과 유사하다. 
인코딩 이름에서 알 수 있듯 처음 nibble만 인코딩을 한다는 의미이다. 
즉, '%34'가 '4'이므로 이 값을 디코딩 하면 '%41'이 된다. 

예) %%341 = 'A' 



5. Second Nibble Hex Encoding
Microsoft IIS에서 지원한다.  
이름을 봐서 알 수 있듯 .. First Nibble과 유사하다.
차이점이라면 두번째 nibble을 인코딩 한다는 점이 다르다.
문법상의 차이로 모양새는 조금 다르지만 이해하는데는 별 문제가 되지 않는다. 
'%31'이 '1'이므로 이 값을 디코딩 하면 '%41'이 된다. 

예) %4%31 = 'A'


6.  Microsoft %U Encoding
Microsoft IIS에서 지원한다.  
%U뒤에 4자리 값이 오는 형식으로 인코딩 한다. 
4자리 값은 0부터 65535까지의 숫자 혹은 16진수로 0x0000 부터 0xffff까지 값이 올 수 있다. 

예) %U0041 = 'A' 

7. UTF-8 Encoding
처음 byte는 길이를 의미하므로 매우 중요하다. 

예) 110xxxxx 10xxxxxx                (two byte sequence)
     1110xxxx 10xxxxxx 10xxxxxx  (three byte sequence)

인코딩을 하기 위해 '%'를 사용한다. 
위에서 xxx 처럼 표현한 부분이 실제 의미있는 값이다. 
다음 예에서 보면.. 녹색으로 표시한 값들이 실제 데이터라고 보면 된다. 

예1) %C0%AF     = 11000000 10101111  =  101111 = 2F = '/'
     %E0%80%AF = 1110
0000 10000000 10101111  = 101111 = 2F = '/'

예2) %C1%81      = 110
00001 10000001 = 1000001 = 41 = 'A'
       %E0%81%81 = 1110
0000 10000001 10000001 = 1000001 = 41 = 'A' 



Full UTF-8 Character Map 링크

8. UTF-8 Bare byte Encoding
Microsoft IIS 서버만이 지원한다. 
UTF-8 인코딩과 같지만 '%'를 쓰지 않는점이 다르다. 

 예) 0xC1 0x81 = 'A'

Posted by KT한
,

목적:
HTTP url에는 다양한 encoding 방식에 의해 변환된 값들이 전송되기 된다. 
이 값들에 대한 재현 혹은 검증을 위해 사용


실행 파일:
 
SetupHttpChameleon.exe
홈페이지:
http://www.idsresearch.org 

사용 절차:
위에서 부터 순차적으로 작성하시면 손쉽게 사용 가능합니다... 만.. 
간략하게 설명을 덧붙일께요. 


1. Http Encoding Library Templates에서 기본적인 양식을 선택 후 "Select" 클릭

2.  Http Request를 원하는 값으로 수정 후 

3. Encodings and Obfuscations에서  원하는 encoding 타입을 설정 후 "Encode" 클릭

4. Encoded Http Request 에서 원하는 request가 생성되었는지 확인

5. Http Host와 Http Port를 입력 하고 "Send Request" 클릭

6. Http Response에서 결과 확인  

※ 인코딩에 관한 자세한 내용을 알고 싶다면 다음 포스팅을 참고하세요. 
http://kthan.tistory.com/47 


Posted by KT한
,

 정규표현식이란?
특수한 텍스트 패턴에 일치하는지 여부를 검사하거나, 텍스트 내에서 특정 패턴과 일치하는 텍스트를 찾기 위해 사용하는 표현식
요즘은 어지간한 어플리케이션에서 모두 지원하고 있다.

정규표현식 툴
물론 돈을 주고 산다면 다양한 기능과 화려한 인터페이스를 자랑하는 툴도 많다. (RegexBuddy)
하지만.. 우리는 공짜를 좋아하기 때문에..
공짜인 "Rad RegexDesigner"를 추천한다

1. 바로 다운받아 사용하고 싶다면  (첨부파일 클릭)Rad.RegexDesigner.Setup.1.4.exe
2. 사이트에가서 설명을 보고 받고 싶다면..  (홈페이지 주소 클릭)

사용법은  "Input Text"에 문자열을 넣고 "Regular Expression"에 정규표현식을 넣은 후
상단에 있는 녹색 재생 버튼을 클릭하면 된다.
매칭 여부는 우측에 있는 "Match Results"에서 확인 가능하다"

예제의 경우 전체 문자열에서 정규표현식에 의해 매칭된 문자열이 네 개로 나온다.



그럼 중급 정규표현식에 대해 알아보자


1. Group ( ) 
특정 패턴을 묶어서 반복 기호등과 함께 사용
 

여러 문자 중 하나만 선택적으로 매칭하고자 할 때 사용.
====================================
  
표현식   ba(na)*
  
문자열  ba na bana banana nana bananana
====================================
====================================
  
표현식   ba(na)+

  문자열  ba na bana banana nana bananana
 ====================================


2. 선택 지정 ( | ) 
괄호로 묶인 그룹 내에서 | 으로 나뉘어진 여러 개의 패턴  하나와 일치하는 것을 가리킨다
====================================
  
표현식   (eg|sa|be)g
  
문자열  egg eng sag sig beg bag
====================================
 

3. Group 참조  \숫자  (backreference)
 Group
으로 지정된 내용을 뒤에 \숫자의 형식으로 재 사용하는데 사용.
 ====================================
  
표현식   (h.t)\1
  
문자열  hathat hitbit hothot hutcut

  표현식   \d\d(\d\d)-\1-\1
  
문자열  2011-11-11
====================================


4.
반복 문자 탐지  Greedy, Lazy
 
반복 문자 개수를 지정하는 방법은 크게 Greedy방식과 Lazy방식으로 나뉘어진다.
 Greedy
 방식은 가능한 최대의 것을 선택하고,  Lazy방식은 가능한 최소의 것을 선택한다.
 Greedy
 방식뒤에 ? 붙이면 Lazy방식이 된다.

-Greedy 방식
====================================
  
표현식   <.*>
  
문자열  Regex <b>Greedy</b> Style
====================================
-Lazy
방식

====================================
  
표현식   <.*?>
  
문자열   Regex <i>Lazy</i> Style
====================================
-
사용

==================
 Greedy  |   Lazy 
==================
  *         |     *?
  +         |    +?
  ?         |     ??
 \d+       |   \d+?
 {n,m}    |   {n,m}?
==================

5.주요 Escape 문자 목록
 \t      
 문자, Tab, \u0009 
 \r     
 바꿈 문자, Carriage Return, \u000D 
 \n     
 바꿈 문자, Line Feed, \u000A 
 \b     [ ] 안에서 사용될 때는 백스페이스 문자, Backspace, \u0008
         [ ]
 밖에서 사용될 때는  단어 경계(Word Boundary), 즉 단어의 시작과 끝 빈문자에 매칭( \bhit => hit 과 매칭)
       
 Pattern에서 사용될 때는 항상 백스페이스 문자
 \\     \
 문자 자체를 가리킬  사용
       
비슷한 사용법 \.   \*   \+   \?   \^   \$   \(   \)   \{   \}   \[   \] 


6. 주요 특수문자 목록 

 특수문자  문자 클래스  설명
  \w [0-9a-zA-Z_]   영문자, 숫자, 언더바(_) 
  \W [^0-9a-zA-Z_]  영문자, 숫자, 언더바(_) 이외 
  \s [\t\n\r\f]  공백( 반각 스페이스, 탭, 개행) 
  \S [^\t\n\r\f] 공백 이외 
  \d [0-9]  숫자 
  \D [^0-9] 숫자 이외

 


참고 사이트 Joinc Wiki     <= 클릭

Posted by KT한
,
정규표현식이란?

특수한 텍스트 패턴에 일치하는지 여부를 검사하거나, 텍스트 내에서 특정 패턴과 일치하는 텍스트를 찾기 위해 사용하는 표현식
요즘은 어지간한 어플리케이션에서 모두 지원하고 있다.

정규표현식 툴
물론 돈을 주고 산다면 다양한 기능과 화려한 인터페이스를 자랑하는 툴도 많다. (RegexBuddy)
하지만.. 우리는 공짜를 좋아하기 때문에..
공짜인 "Rad RegexDesigner"를 추천한다

1. 바로 다운받아 사용하고 싶다면  (첨부 파일 클릭)
Rad.RegexDesigner.Setup.1.4.exe
2. 사이트에가서 설명을 보고 받고 싶다면..  (홈페이지 주소 클릭)

사용법은  "Input Text"에 문자열을 넣고 "Regular Expression"에 정규표현식을 넣은 후
상단에 있는 녹색 재생 버튼을 클릭하면 된다.
매칭 여부는 우측에 있는 "Match Results"에서 확인 가능하다"

예제의 경우 전체 문자열에서 정규표현식에 의해 매칭된 문자열이 네 개로 나온다.



그럼 초급 정규표현식에 대해 알아보자

1. 점( . )
 .
 임의의 한 문자 가리킨다. ( "줄바꿈 문자(\n)" 제외)
====================================
  
표현식  h.t
  
문자열  hat halt hit heat hot
====================================
  
표현식   h..t
  
문자열  hat halt hit heat hot
====================================

2. 대괄호 [ ]
 [ ]
안에 있는 문자중 하나를 가리킨다.
 [abc]    a,b,c
하나
 [a-z]    
알파벳 소문자 하나
 [0-9]    
숫자 하나
 [a-zA-Z]   
알파벳 소문자나 대문자 하나
====================================
  
표현식   h[aiu]t
 
문자열  hat het hit hot hut
====================================

3. 대괄호와 캐럿 [^ ]
 [^ ]
안에 있는 문자를 제외한 문자중 하나를 가리킨다.
 [^abc]    a,b,c
이외의 문자 하나
 [^a-z]    
알파벳 소문자 이외의 문자 하나
 [^0-9]    
숫자 이외의 문자 하나
 [^a-zA-Z]  
알파벳 소문자나 대문자 이외의 문자 하나
====================================
  
표현식   h[^aiu]t
  
문자열  hat het hit hot hut
====================================

4. 별표( * )
 *
바로 앞에 있는 문자가 0회 이상 반복되는 것을 가리킨다.
====================================
  
표현식   ha*t
  
문자열  ht hit hat hot haat hut haaaaat
====================================

5. 플러스(+)
 +
바로 앞에 있는 문자가 1회 이상 반복되는 것을 가리킨다.
====================================
  
표현식   ha+t
  
문자열  ht hit hat hot haat hut haaaaat
====================================

6. 물음표( ?)
 ?
바로 앞에 있는 문자가 0또는 1회 반복되는 것을 가리킨다.
====================================
  
표현식   ha?t
  
문자열  ht hit hat hot haat hut haaaaat
====================================

7. {n}
 {n}
바로 앞에 있는 문자가 n회 반복되는 것을 가리킨다.
====================================
  
표현식   ha{2}t
  
문자열  ht hit hat hot haat hut haaaaat
====================================

8. {n,}
 {n,}
바로 앞에 있는 문자가 n회 이 반복되는 것을 가리킨다.
 
{0,} 별표(*) 같은 의미이다.
 {1,} 더하기(+) 같은 의미이다
 {0,1} 물음표(?) 같은 의미이다
 
====================================
 
  표현식   ha{2,}t
 
  문자열  ht hit hat hot haat hut haaaaat
 
====================================
 

9. {n,m}
 {n,m}
바로 앞에 있는 문자가 n회 이상, m회 이하 반복되는 것을 가리킨다.
====================================
  
표현식   ha{2,4}t
  
문자열  ht hat haat haaat haaaat haaaaat
====================================

10. 캐럿( ^)
 ^
줄의 제일 처음(시작위치) 가리킨다.
====================================
  
표현식   ^h.t
  
문자열  hat hit hot
====================================

11. 달러( $)
 $
줄의 제일 마지막( 위치) 가리킨다.
====================================
  
표현식    h.t$
  
문자열  hat hit hot
====================================

 


Posted by KT한
,