Computer Science Basic/Software Enginnering & Security

[소프트웨어 보안] 8주차: 버퍼 오버플로우 퀴즈

gapsoo 2025. 5. 5. 22:10

1. 다음 중 StackGuard에 대한 설명으로 옳은 것은?

(1) Stack 영역을 실행 불가능하게 만드는 하드웨어 기능이다.
(2) 스택에 삽입된 canary 값을 함수 종료 시 검사하여 스택 변조 여부를 판단한다.
(3) getuid()를 0으로 설정하여 setuid 우회를 수행하는 기법이다.
(4) 셸코드 내에서 /bin/sh 경로를 문자열로 제공하지 않아도 된다.

 

더보기

정답: (2) 스택에 삽입된 canary 값을 함수 종료 시 검사하여 스택 변조 여부를 판단한다.

 

관련 내용:

StackGuard는 스택 기반 버퍼 오버플로우를 방지하기 위한 컴파일러 기반 보안 기법이다.

함수 시작 시, 리턴 주소와 버퍼 사이에 canary(카나리)라 불리는 임의의 값을 삽입한다.

함수 종료 시, 이 값이 변경되었는지를 검사한다.

canary 값이 변경되었다면, 스택이 변조되었음을 의미하므로 프로그램은 즉시 종료된다.

 

보기 해설:

(1) 오답. 스택 영역을 실행 불가능하게 만드는 기능은 하드웨어 기반의 NX (Non-eXecutable) 비트에 대한 설명이다. StackGuard는 실행 여부와는 무관하다.

(2) 정답. StackGuard는 리턴 주소가 있는 영역을 보호하기 위해 스택에 canary 값을 삽입하고, 이 값이 함수 종료 시 변경되었는지를 검사한다.

(3) 오답. 이는 bash에서 setuid 우회를 위한 공격 기법에 대한 설명이며 StackGuard와는 관련이 없다.

(4) 오답. 셸코드는 쉘 실행을 위해 /bin/sh 경로를 문자열로 제공해야 한다. 이를 생략하면 셸 실행이 불가능하다.

 

 

2. 다음 중 ASLR의 주된 목적은 무엇인가?

(1) 스택 오버플로우 시 입력 길이를 자동 제한한다.
(2) 정적 분석 도구의 실행을 막기 위해 메모리를 암호화한다.
(3) 프로그램의 스택, 힙 등의 시작 주소를 무작위화하여 공격자가 주소를 예측하기 어렵게 만든다.
(4) 셸코드 삽입을 방지하기 위해 strcpy 함수를 제거한다.

 

더보기

정답: (3) 프로그램의 스택, 힙 등의 시작 주소를 무작위화하여 공격자가 주소를 예측하기 어렵게 만든다.

 

관련 내용:

ASLR(Address Space Layout Randomization)은 운영체제 수준의 보안 기법으로, 프로그램의 메모리 배치 주소를 매 실행마다 무작위로 변경한다.

스택, 힙, 공유 라이브러리, 코드 등 주요 메모리 공간의 시작 주소를 랜덤하게 설정한다.

공격자가 정확한 주소를 예측하기 어렵게 만들어 버퍼 오버플로우와 같은 공격이 실패하도록 유도한다.

 

보기 해설:

(1) 오답. 입력 길이 제한은 strncpy와 같은 안전한 함수 사용에 관련된 개발자 차원의 대응책이며 ASLR과 관련 없다.

(2) 오답. ASLR은 메모리 암호화를 수행하지 않는다. 주소 무작위화가 목적이다.

(3) 정답. ASLR의 핵심 목적은 메모리 주소를 예측할 수 없도록 무작위화하여 공격을 어렵게 만드는 것이다.

(4) 오답. strcpy 함수 제거는 소스코드 차원의 보안 조치이며, ASLR의 기능과는 무관하다.

 

3. O/X 문제

1. strcpy 함수는 복사 길이를 검사하지 않기 때문에 버퍼 오버플로우를 유발할 수 있다.

2. NX(Non-eXecutable) 스택은 코드 실행과 데이터 저장을 동시에 허용한다.

3. Return-to-libc 공격은 NX 스택에 대한 대응책을 우회하기 위한 기법 중 하나이다.

4. bash에서는 setuid바이너리가 실행되더라도 쉘에서 루트 권한을 그대로 유지한다.

5. StackGuard는 함수 시작 시 삽입되는 특정 어셈블리 코드로 Canary 값을 설정하고 검사한다.

 

더보기

1. 정답: O

해설:strcpy()는 문자열을 복사할 때 길이 제한이 없기 때문에, 입력 데이터가 버퍼 크기를 초과하면 스택 영역을 덮어쓰는 버퍼 오버플로우가 발생한다.

 

2. 정답: X

해설:NX 스택은 데이터와 코드를 분리하기 위한 하드웨어/OS 보안 기능으로, 스택 영역에서의 코드 실행을 막는다. 즉, 셸코드를 실행하지 못하게 한다.

 

3. 정답: O

해설:NX 스택으로 인해 셸코드를 직접 실행할 수 없을 경우, 공격자는 system("/bin/sh")과 같은 libc 함수 주소를 호출하는 방식으로 셸 실행을 시도함. 이를 Return-to-libc 공격이라 부른다.

 

4. 정답: X

해설:bash와 dash는 보안을 위해 getuid()와 geteuid()가 다르면, 즉 루트 권한으로 실행되더라도 일반 사용자 권한으로 전환(setuid drop)한다.따라서 루트 셸 획득이 불가능하다. 이를 우회하려면 셸코드 내에서 setuid(0) 호출이 필요하다.

 

5. 정답: O

해설:컴파일 시 StackGuard 기법이 활성화되면, 함수 시작 시 Canary 값을 삽입하고, 함수 종료 전에 이 값이 변경되었는지를 검사하는 어셈블리 코드가 자동으로 삽입된다.값이 바뀌었을 경우 stack smashing detected 메시지를 출력하고 종료한다.