SH1R0_HACKER

009. Buffer Overflow in C++ (4) 본문

System/System Exploitation

009. Buffer Overflow in C++ (4)

SH1R0_HACKER 2021. 2. 13. 22:09

[ Type Confusion ]

 

Type Confusion은 프로그램에서 사용하는 변수나 객체를

선언 혹은 초기화되었을 때와 다른 타입으로 사용할 때 발생하는 취약점입니다.

 

위 코드는 C언어에서 정수를 입력받아 출력하는 예제입니다.

 

puts 함수의 원형은 아래와 같습니다.

int puts(const char *s)

 

정수로 값을 입력받지만 puts 함수는 char* 형 포인터를 인자로 받기 때문에 Type Confusion이 발생해

메모리에 존재하지 않는 주소를 입력한다면 다음과 같이 프로그램이 비정상 종료됩니다.

 

비주얼 스튜디오에서는 컴파일을 시도하면 오류가 발생합니다.


[ Type Casting ]

 

형 변환은 변수 혹은 객체의 형태를 기존과 다른 형태로 바꾸는 것을 말합니다.

필요에 따라서 변경되는 암시적 형 변환과 프로그래머가 직접 변경하는 명시적 형 변환으로 나눌 수 있습니다.

 

C++에서 객체의 형태를 변환할 때 사용되는 연산자로는 아래와 같습니다.

 

dynamic_cast<new_type>(expression)

: 포인터나 레퍼런스를 기본 클래스 -> 파생 클래스로의 다운 캐스팅과,

다중 상속에서 클래스 간의 안전한 타입 캐스팅에 사용됩니다.

 

reinterpret_cast<new_type>(expression)

: 임의의 포인터 타입끼리 변환을 허용하는 캐스트 연산자입니다.

정수형을 포인터로 바꿀 수 있어서 (정수값이 포인터의 절대 주소로 들어감) 위험한 방법입니다.

 

static_cast<new_type>(expression)

: 논리적으로 변환 가능한 타입을 변환합니다. (명시적 형 변환을 위한 캐스트 연산자)

실수와 정수, 열거형과 정수형, 실수와 실수 사이의 변환 등을 허용합니다.

 

const_cast<new_type>(expression)

: 클래스에서 const, volatile 및 __unaligned 특성을 제거합니다.

 

위 코드는 dynamic_cast를 이용해 클래스 A를 클래스 B로 형 변환하는 예제입니다.

 

프로그램이 실행되는 도중 형 변환 과정에서 객체의 형태를 검사하는

dynamic_cast와 달리 static_cast와 reinterpret_cast에는 이러한 검증이 존재하지 않아

Type Confusion 취약점이 발생할 수 있습니다.

 

 

'System > System Exploitation' 카테고리의 다른 글

010. Logical Bugs - 로지컬 버그  (0) 2021.02.14
009. Buffer Overflow in C++ (3)  (0) 2021.02.13
009. Buffer Overflow in C++ (2)  (0) 2021.02.09
008. Buffer Overflow in C++ (1)  (0) 2021.02.09
007. Integer issues  (0) 2021.02.07