SH1R0_HACKER

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

System/System Exploitation

009. Buffer Overflow in C++ (3)

SH1R0_HACKER 2021. 2. 13. 19:53

[ UAF(Use-After-Free) in C++ ]

 

C++ 언어에서도 UAF 취약점이 발생할 수 있습니다.

UAF 취약점은 Heap 영역에서 할당된 메모리를 해제(Free)하고 다시사용(re-use)할 때 발생하는 취약점입니다.

 

4행에서 구조체 S를 정의하고 f() 함수를 호출합니다.

main 함수에서 객체 s를 동적 할당하고 11행에서 해제합니다.

13행에서 해제된 s를 참고하여 f 함수를 호출하려고 시도합니다.

 

이러한 형태는 가장 기본적인 UAF 취약점 입니다.

공격자가 해제된 객체 s의 메모리에 원하는 값을 쓰게 된다면 치명적일 수 있습니다.

 

아래의 코드는 UAF가 발생하는 또 다른 예제입니다.

 

str_func 함수에서 리턴받은 "aaaa" 문자열을 char형으로 str 변수에 저장하고,

display_string 함수의 인자로 넘겨주어서 출력하는 코드입니다.

 

str_func 함수에서 생성되는 string 객체 a는 7행에서 반환되는 즉시 해제됩니다.

그러나 str 변수는 해당 객체의 문자열 포인터를 계속 참고하고 있어서 15행 이후에는 해제된 메모리를 가리키게 됩니다.

 

이후 새로 생성되는 객체 b가 해당 메모리를 사용하게 된다면 str 변수로 인해 UAF가 발생합니다.


[ Smart Pointers ]

 

스마트 포인터란?

C++에서 메모리 누수 (Memory leak)로 부터 프로그램의 안전성을 보장하기 위해 제공하는 템플릿 입니다.

사용이 끝난 메모리를 자동으로 해제해주는 역할을 하고 있습니다.

 

스마트 포인터를 올바르게 사용하지 않는다면 UAF가 발생할 수 있습니다.

스마트 포인터를 사용할 때 주의할 점은, 같은 메모리를 서로 다른 두 개의 스마트 포인터가 가리키게 해서는 안됩니다.

 

위 코드의 경우에는 main 함수가 종료될 때 p1, p2가 사라지게 되고,

p1, p2가 관리하고 있던 i를 두번 해제해버리는 Double Free 버그가 발생합니다.

 

다음 예제는 조금 더 복잡한 예제입니다.

 

객체 B가 5행에 정의되어 있고, 이를 상속하는 객체 D가 9행에 정의되어 있습니다.

함수 g는 인자로 std::shared_ptr<D> 형의 값을 받습니다.

 

main 함수에서는 D의 인스턴스를 생성하고 이를 std::shared_ptr<B> 형의 스마트 포인터 poly에 저장합니다.

그 다음 17행에서 함수 g를 호출하기 위해 B형으로 선언된 poly를 형 변환합니다.

 

poly와 함수 g의 인자로 전달하기 위해 만든 새로운 스마트 포인터는 서로 다른 레퍼런스 카운터를 가지고 있고,

15행에서 new D를 통해 만든 인스턴스를 각각 가리킵니다.

 

따라서 함수 g의 호출이 끝날 때 poly가 가지고 있는 포인터는 해제됩니다.

 

 

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

010. Logical Bugs - 로지컬 버그  (0) 2021.02.14
009. Buffer Overflow in C++ (4)  (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