2012. 8. 5. 13:20ㆍHacking/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)
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 옵션을 이용하면 된다.