-
[Linux Memory Protection] - Stack CanarySystem hacking training/Knowledge 2019. 5. 17. 10:46
복습겸 리눅스 환경의 메리 보호 기법에 대해 알아봅시다.
Ref : https://bpsecblog.wordpress.com/2016/05/16/memory_protect_linux_1/
이 글을 토대로 공부한 내용을 포스팅하겠습니다.
- 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를 띄우고 종료됩니다.
이렇게 리눅스 환경에서 메모리 보호기법에 대해 알아봤습니다.
이상으로 포스팅을 마칩니다.
반응형'System hacking training > Knowledge' 카테고리의 다른 글
[Linux Memory Protection] - RELRO (2) 2019.05.20 [Linux Memory Protection] - ASCII-Armor (0) 2019.05.15 [Linux Memory Protection] - DEP (0) 2019.05.14 [Linux Memory Protection] - ASLR (2) 2019.05.14 What is heap - part 2 (0) 2018.12.21