널 문자
1. 개요
널 문자는 소스 코드에서 `\0`, `\x00` 등으로 표현되며, 대부분의 현대 문자 집합에서 코드 포인트 값 0을 가진다. C 언어와 C++에서는 문자열의 끝을 나타내는 중요한 역할을 하며, 널 종료 문자열로 불린다. 널 문자는 널 바이트 삽입 공격에 취약할 수 있으며, 유니코드에서는 널 문자(U+0000)와 널 기호(U+2400, ␀)가 별개의 문자로 정의된다.
이미지 준비중입니다.
| 유니코드 이름 | Null |
|---|---|
| 유니코드 번호 | U+0000 |
| HTML 엔티티 | |
| C 표현 | \0 |
| 아스키 코드 | 0 |
| 용도 | 문자열 종료 패딩 |
|---|---|
| 표현 | 보이지 않는 문자 |
| 동작 | 아무런 동작도 수행하지 않음 |
| 기원 | 텔레타이프 기계에서 라인 피드 또는 캐리지 리턴과 같은 제어 문자를 보내는 데 걸리는 시간을 채우기 위해 도입됨. 펀치 카드 시스템에서 빈 공간을 표시하는 데 사용됨. |
|---|
| C/C++ | 널 문자는 문자열의 끝을 나타내는 데 사용됨. |
|---|---|
| 자바 | 자바 문자열은 널 문자로 끝나지 않음. |
| 기타 언어 | 다양한 방식으로 널 문자를 처리함. |
| 널 문자 삽입 공격 | 널 문자를 입력값에 삽입하여 예상치 못한 동작을 유발할 수 있음. |
|---|
| 참고 | 널 포인터와 혼동하지 말 것. |
|---|
-
제어 문자 -
공백 문자
공백 문자는 단어를 구분하고 텍스트의 구조를 나타내기 위해 사용되며, 언어와 컴퓨터 환경에 따라 다양한 형태로 존재하고 활용된다. -
제어 문자 -
이스케이프 시퀀스
이스케이프 시퀀스는 컴퓨터 주변 장치의 상태를 변경하는 문자열로, 초기 보도 코드에서 시작하여 ASCII 표준을 거쳐 발전했으며 터미널, 프린터, 모뎀 제어 등에 사용되고, C 언어에서는 백슬래시를 사용하여 특수 문자를 표현한다. -
취약점 공격 -
보안 취약점
보안 취약점은 시스템의 설계, 구현, 운영, 관리상 결함이나 약점으로, 위협에 의해 악용되어 시스템 보안 정책을 위반할 수 있는 요소이며, ISO 27005, IETF RFC 4949, NIST SP 800-30, ENISA 등 다양한 기관에서 정의하고 있다. -
취약점 공격 -
인터넷 보안
인터넷 보안은 사이버 위협, 악성 소프트웨어, 서비스 거부 공격 등으로부터 정보와 시스템을 보호하기 위해 네트워크 계층 보안, 다단계 인증, 방화벽 등 다양한 기술과 방법을 포괄한다.
2. 표현
소스 코드에서 널 문자는 문자열 리터럴에서 이스케이프 시퀀스 `\0`으로 표현되는 경우가 많다. 이는 C 언어를 포함한 많은 언어에서 사용되는 표기법이다. `\0`은 단순히 8진수 0을 나타내는 이스케이프 시퀀스이며, 뒤에 0부터 7까지의 숫자가 올 수 없다. 다른 이스케이프 시퀀스로는 `\000`, `\x00`, `\z`, `\u0000` 등이 있다.
URL에서는 널 문자를 퍼센트 인코딩으로 표현하여 `%00`으로 나타낸다. 이는 널 바이트 삽입 공격을 방지하기 위함이다.
캐럿 표기법에서는 널 문자를 `^@`로 표현한다. 일부 키보드에서는 Ctrl 키와 @ 키를 함께 눌러 널 문자를 입력할 수 있다.
문서에서는 널 문자를 "NUL" 기호(␀, 유니코드 U+2400)로 시각적으로 표현하기도 한다.
3. 인코딩
모든 현대 문자 집합에서 널 문자는 코드 포인트 값이 0이다. 대부분의 인코딩에서 이는 값이 0인 단일 코드 단위로 변환된다. 예를 들어, UTF-8에서는 단일 0 바이트이다. 그러나 수정된 UTF-8에서는 널 문자가 두 바이트 0xC0,0x80영어로 인코딩된다. 이렇게 하면 0x00 바이트를 문자열 종결자로 사용할 수 있다.
4. 프로그래밍 언어에서의 널
C 언어와 C++에서 널 문자는 문자열의 끝을 나타내는 널 종료 문자열(null-terminated string)을 만드는 데 사용된다. 즉, 문자열 마지막에 널 문자를 넣어 문자열의 끝을 표시한다. Java, .NET 등에서는 문자열이 길이 정보를 포함하는 데이터 구조로 표현되므로, 널 문자가 문자열 중간에 포함될 수 있다.
포인터 값이 널인 널 포인터는 아무것도 가리키지 않는 포인터를 나타낸다. 보통 메모리 주소 0을 사용하며, 이 주소를 읽으려고 하면 대부분의 운영 체제는 오류를 발생시킨다.
일부 언어에서는 0, '', "" 등이 널(NULL)과 같은 의미로 사용되기도 한다.
널 문자는 전신 타자기를 컴퓨터 출력 장치로 사용할 때 각 행의 끝에 추가되어 인쇄 기구가 행의 시작 부분으로 돌아갈 시간을 벌어주는 역할도 했다.
4.1. 널 문자와 관련된 문제점
널 문자는 많은 프로그램에서 문자열의 끝으로 간주되므로, 이를 악용하여 널 바이트 삽입이라는 취약점을 만들 수 있으며, 이는 보안 익스플로잇으로 이어질 수 있다.
이러한 특성 때문에 널 문자를 포함하는 데이터를 올바르게 처리하지 못하는 시스템도 있다. 예를 들어, CSS 2.1에서는 스타일 시트에 널 문자가 포함될 경우(이스케이프를 통해 생성된 경우 포함)의 동작이 정의되지 않았다.