널 문자

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

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에서는 스타일 시트에 널 문자가 포함될 경우(이스케이프를 통해 생성된 경우 포함)의 동작이 정의되지 않았다.

5. 널 바이트 공격과 보안

확인되지 않은 사용자 입력으로 널 문자를 입력할 수 있는 것은 널 바이트 삽입이라고 하는 취약점을 만들어 보안 익스플로잇으로 이어질 수 있다. 널 바이트 삽입은 악의적인 사용자가 널 문자를 입력하여 시스템의 보안을 뚫는 공격 방법이다. 대한민국 정보보호 관련 기관들은 널 바이트 공격을 포함한 다양한 보안 위협에 대한 대응책을 마련하고 있다.

6. 유니코드

유니코드에서 널 문자(U+0000)와 널 기호(U+2400, ␀)는 별개의 문자이다. 널 기호는 널 문자를 시각적으로 표현하기 위한 것이다.

👆
좌우로 밀어서 보기
기호유니코드JIS X 0213문자 참조명칭
U+0000널 문자
U+2400널 기호