Iriton's log

Memory Corruption: Stack Buffer Overflow 본문

Pwnable/Study

Memory Corruption: Stack Buffer Overflow

Iriton 2024. 4. 1. 22:03

*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다.

 

스택 버퍼 오버플로우

스택의 버퍼에서 발생하는 오버플로우

 

버퍼

CS에서 버퍼는 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소의 의미로 사용된다.

데이터 처리속도가 다른 두 장치가 있을 때, 이 둘 사이에 오가는 데이터를 임시로 저장해 두는 것은 일종의 완충 작용을 한다.

이해를 돕기 위해 키보드에서 데이터가 입력되는 속도보다 데이터를 처리하는 속도가 느린 프로그램이 있다고 가정해 보자. 사

이에 별도의 장치가 없다면 키보드의 입력 중에 프로그램에서 수용되지 못한 데이터는 모두 유실될 것이다.

이런 문제를 해결하고자 수신 측과 송신 측 사이에 버퍼라는 임시 저장소를 두고 이를 통해 간접적으로 데이터를 전달하게 한다.

송신 측은 버퍼로 데이터를 전송하고 수신 측은 버퍼에서 데이터를 꺼내 사용하면 버퍼가 가득 찰 때까지는 유실되는 데이터 없이 통신할 수 있다.

 

버퍼 오버플로우

문자 그대로 버퍼가 넘치는 것을 말한다.

버퍼는 제각기 크기를 가지고 있는데 int로 선언한 지역 변수는 4바이트이고 10개의 원소를 갖는 char 배열은 10바이트 크기를 갖는다.

만약 10바이트 크기의 버퍼에 20바이트 크기의 데이터가 들어가려 하면 오버플로우가 발생한다. 이에 따라 메모리 오염이 발생하여 뒤에 버퍼 값이 조작될 위험이 있다.

 

중요 데이터 변조

입력 데이터에서 악성 데이터를 감지하여 경고해 주는 프로그램이 있을 때 악성의 조건이 변경되면 악성 데이터에도 알람이 울리지 않을 수 있다.

또한 dreamhack.io와 통신하는 프로그램이 있다면 주소를 exploit.evil로 조작하여 악성 서버와 데이터를 주고받게 할 수도 있다.

 

데이터 유출

C언어에서 정상적인 문자열은 널 바이트로 종결되며 표준 문자열 출력 함수들은 널바이트를 문자열 끝으로 인식한다.

만약 어떤 버퍼에 오버플로우를 발생시켜섯 다른 버퍼와의 사이에 있는 널바이트를 제거하면 해당 버퍼를 출력시켜서 다른 버퍼의 데이터를 읽을 수 있다.

획득한 데이터는 각종 보호기법을 우회하는 데 사용될 수 있으며, 해당 데이터 자체가 중요한 정보일 수도 있다.

 

실행 흐름 조작

함수를 호출할 때 반환 주소를 스택에 쌓고 함수에서 반환될 때 이를 꺼내어 원래의 실행 흐름으로 돌아간다고 했다.

이를 공격자 관점에서 바라보면 스택 버퍼 오버플로우로 반환 주소를 조작하면 어떻게 될까 하는 궁금증을 가져볼 수 있다.

그리고 실제로 오버플로우를 시켜서 함수의 반환 주소를 원하는 메모리 주소로 이동하게 바꿀 수 있다.

'Pwnable > Study' 카테고리의 다른 글

Mitigation: Stack Canary  (0) 2024.05.07
Exploit Tech: Return Address Overwrite  (0) 2024.04.09
Background: Calling Convention  (0) 2024.04.01
Exploit Tech: Shellcode  (0) 2024.03.27
Tool: gdb & pwntools  (0) 2024.03.20
Comments