System hacking training/Knowledge

[Linux Memory Protection] - Stack Canary

fkillrra 2019. 5. 17. 10:46

복습겸 리눅스 환경의 메리 보호 기법에 대해 알아봅시다.

 

Ref : https://bpsecblog.wordpress.com/2016/05/16/memory_protect_linux_1/

 

linux 환경에서의 메모리 보호기법을 알아보자(1)

지금부터 Linux 환경에서의 메모리 보호 기법에 대해 알아봅시다! 이번 편에서는 ASLR, NX, ASCII-Armor, Stack canary에 대해 알아보겠습니다. 위키를 통해 “메모리 보호”라는 말의 정의를 알아보고 넘어갑시다. 실습 환경: CentOS 6.7 (32bit) ASLR : Address Space Layout Randomizati…

bpsecblog.wordpress.com

이 글을 토대로 공부한 내용을 포스팅하겠습니다.

 

  • ASLR 
  • DEP(NX)
  • ASCII-Armor 
  • Stack Canary <- 요놈ㅎ

Stack Canary에 대해 알아봅시다.

Stack Canary는 함수 진입시 스택에 SFP(Save Frame Pointer)와 return address 정보를 저장할 때,

이 정보들이 공격자에 의해 덮어씌워지는 것으로부터 보호하기 위해 스택 상의 변수들의 공간과 SFP 사이에 특정한 값을 추가하는데 이 값이 바로 Canary입니다.

 

예를 들어 Buffer Overflow 취약점을 이용하여 return address를 조작하려고 한다면

다음과 같은 형태로 dummy값을 buffer를 초과하여 넣고, ret에 도달을 한뒤 return address를 shellcode의 주소로 변조를 해야하는데

 

이 과정에서 위 그림과 같이 Stack Canary값 또한 공격자가 input한 값으로 변조가 됩니다.

 

Stack Canary값의 변조 유무에 따라 Buffer Overflow를 탐지하기 때문에 기존의 값과 다른 위 경우 bof가 탐지 되어 return address가 변조되지 않고 종료가 됩니다.

 

내부적으로 어떤 과정을 갖는지 예제를 통해 알아봅시다.

 

#include <stdio.h>

int main()
{
	char buf[256];
	
	gets(buf);
	printf("addr : %p\n", buf);

	return 0;
}

[컴파일 옵션]

[Stack Canary 해제]
gcc Stack_Canary.c -o Stack_Canary -m32 -mpreferred-stack-boundary=2 -z execstack -no-pie -fno-stack-protector

[Stack Canary 설]
gcc Stack_Canary.c -o Stack_Canary -m32 -mpreferred-stack-boundary=2 -z execstack -no-pie

두 바이너리를 비교해보면 다음과 같이 눈에 띄게 다른 부분을 확인 할 수 있는데요.

 

Canary가 존재할 때

먼저 main+21에서 eax에 gs:0x14에서 Canary값을 가져와 저장하고, 이후 ebp - 0x8에 저장합니다.

 

그리고 에필로그 실행 전 스택에 저장했던 Canary값과 gs:0x14의 원본 값을 비교하여 그 값이 다르다면 Buffer Overflow 공격을 당했다고 판단하고 프로그램이 종료됩니다.

 

직접 bp를 걸고 확인해보면 처음 gs:0x14에서 가져온 Canary값을 eax에 저장한 값과

 

A를 bof가 일어날 때 까지 넣었을 때의 값을 비교했을 때 Canary값이 변조되었고,

 

프로그램은 Stack Canary값이 변조된것을 확인하여 Stack smashing detected를 띄우고 종료됩니다.

 

이렇게 리눅스 환경에서 메모리 보호기법에 대해 알아봤습니다.

 

이상으로 포스팅을 마칩니다.

반응형