SSP(Stack Smashing Protector) 끄기

2012. 8. 5. 13:20Hacking/System

반응형

현재 나의 리눅스는 우분투12.04 LTC이다.


책을 보면서 혼자 교재에 나온 오버플로우 샘플코드를 쳐서 컴파일 시키는데

제대로 작동하지 않는 것이다.


*** stack smashing detected ***: ./overflow_example terminated

======= Backtrace: =========

/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb763edd5]

/lib/i386-linux-gnu/libc.so.6(+0xffd8a)[0xb763ed8a]

./overflow_example[0x80485c9]

/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75584d3]

./overflow_example[0x80483d1]

======= Memory map: ========

08048000-08049000 r-xp 00000000 08:01 918911     /home/alex/문서/Hack/The Art of Exploitation/overflow_example

08049000-0804a000 r--p 00000000 08:01 918911     /home/alex/문서/Hack/The Art of Exploitation/overflow_example

0804a000-0804b000 rw-p 00001000 08:01 918911     /home/alex/문서/Hack/The Art of Exploitation/overflow_example

0a03e000-0a05f000 rw-p 00000000 00:00 0          [heap]

b750e000-b752a000 r-xp 00000000 08:01 784948     /lib/i386-linux-gnu/libgcc_s.so.1

b752a000-b752b000 r--p 0001b000 08:01 784948     /lib/i386-linux-gnu/libgcc_s.so.1

b752b000-b752c000 rw-p 0001c000 08:01 784948     /lib/i386-linux-gnu/libgcc_s.so.1

b753e000-b753f000 rw-p 00000000 00:00 0 

b753f000-b76de000 r-xp 00000000 08:01 784915     /lib/i386-linux-gnu/libc-2.15.so

b76de000-b76e0000 r--p 0019f000 08:01 784915     /lib/i386-linux-gnu/libc-2.15.so

b76e0000-b76e1000 rw-p 001a1000 08:01 784915     /lib/i386-linux-gnu/libc-2.15.so

b76e1000-b76e4000 rw-p 00000000 00:00 0 

b76f4000-b76f8000 rw-p 00000000 00:00 0 

b76f8000-b76f9000 r-xp 00000000 00:00 0          [vdso]

b76f9000-b7719000 r-xp 00000000 08:01 784911     /lib/i386-linux-gnu/ld-2.15.so

b7719000-b771a000 r--p 0001f000 08:01 784911     /lib/i386-linux-gnu/ld-2.15.so

b771a000-b771b000 rw-p 00020000 08:01 784911     /lib/i386-linux-gnu/ld-2.15.so

bfc30000-bfc51000 rw-p 00000000 00:00 0          [stack]

중지됨 (core dumped)


-_-;여기서 나오는 stack smashing detected는 GCC4.1이상 버젼에서 컴파일시 거의 자동으로 SSP 기능을 삽입하여 프로그램의 안전도를 높여준다.
가끔 스택 오버플로우가 나는 경우를 강제로 만든다거나(나와 같이 EXPLOIT이라든가 해킹/보안 공부하시는 분들) 하면 이러한 SSP는 제대로 동작 원리를 배울수 없기 때문에 반드시 꺼줘야 한다.


이를 위한 방법은 아래와 같다.

gcc -o overflow_example overflow_example.c -fno-stack-protector -fno-pie -mpreferred-stack-boundary=2

아래는 http://studyfoss.egloos.com 에서 긁어온 좀 더 자세한 내용이다.

gcc 4.1 버전 이후부터는 stack overflow를 방지하기 위한 SSP (stack-smashing protector) 기능이 내장되어 있다.

SSP는 함수 진입 시 스택에 return address와 frame pointer 정보를 저장할 때
이 정보를 보호하기 위해 (canary라고 부르는) 특정한 값을 기록해두고
함수에서 반환할 때 기록된 값이 변경되지 않았는지 검사하여 정보의 일관성을 관리한다.
만약 악의적인 사용자가 buffer overflow 등의 공격을 통해 스택 내의 정보를 덮어쓰려면
canary 값을 먼저 덮어써야 하기 때문에 canary 값 만 보면 공격이 일어났는지를 알 수 있다.

canary라는 이름은 탄광에서 광부들이 작업할 때 유독 가스가 발생하는지 확인하기 위해
가스에 훨씬 민감한 카나리아를 함께 데리고 가는 것에서 유래되었다고 한다.

SSP 기능을 사용하기 위해서는 컴파일 시에 -fstack-protector 옵션을 추가해야 한다.
(빌드 시 configure 설정에 따라 해당 옵션 없이 기본적으로 활성화되기도 한다)
또한 기본적으로는 일정 크기 이상의 char형 배열을 포함하는 함수에 대해서만 SSP를 적용한다.
(기본 값은 8이며 컴파일 시 --param ssp-buffer-size=N 옵션으로 변경할 수 있다.)
이와 상관없이 모든 함수에 적용하고 싶다면 -fstack-protector-all 옵션을 이용하면 된다.

반응형