포너블을 하는데 있어서 스스로 코드를 만들어보고 분석해볼 필요가 있을 거 같아 메모리 보호기법 해제에 대한 글을 올립니다.
적혀있는 코드들은 해당 기법을 제거하는 컴파일 옵션입니다.
0. 옵션 모두 제거(32bit)
gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack -no-pie -o abcd abcd.c
모든 옵션을 제거하여 공부할 때 사용할 것.
checksec으로 확인.
1. ASLR(Address Space Layout Randomization)
cat /proc/sys/kernel/randomize_va_space #check ASLR
echo 0 > /proc/sys/kernel/randomize_va_space
#permission error 발생 시
sudo bash -c "echo 0 > /proc/sys/kernel/randomize_va_space"
randomize_va_space=0이면 ASLR 해제
randomize_va_space=1이면 stack, library가 랜덤
randomize_va_space=2이면 stack, heap, library가 랜덤
우회기법 : memory leak, ROP ..
2. NX bit
gcc -z execstack
stack에 실행권한 제거.
우회기법 : RTL, GOT overwrite, ROP...
3. Canary(Stack Smashing Protector)
gcc -fno-stack-protector
메모리가 변조되었는지 검사.
gcc -fstack-protector
이건 canary를 넣는 옵션
우회기법 : ROP, memory leak, brute force
4. RELRO(RELocation Read Only)
gcc -z relro #Partial RELRO
gcc -z relro -z now #FULL RELRO
gcc -z norelro #NO RELRO
NO RELRO : ELF 기본 헤더, 코드 영역등을 제외한 거의 모든 부분에 read, write 권한을 준다.
PARTIAL RELRO : .ctors, .dtors, .jcr, .dynamic 섹션이 ready-only 즉, 쓰기 권한이 없어진다.
FULL RELRO : BSS영역을 제외한 모든 부분에서 write권한이 없다.
메모리가 변경되는 것을 보호한다.
우회기법 : memory leak, ROP
5. PIE(Position Independent Executable)
gcc -no-pie # no pie
gcc -fpie # .text ramdomize
gcc -fpie -pie # PIE
모든 심볼 주소를 상대적으로 작성하고 base address를 랜덤화해서 함수들의 주소를 실행할 때마다 랜덤화한다.
우회 기법 : memory leak, ROP
6. 32bit compile
sudo apt-get install gcc-multilib #설치가 선행됨.
gcc -m32 #32bit compile
gcc -m64 #default
7. dummy 제거
gcc -mpreferred-stack-boundary=2 #32bit
gcc -mpreferred-stack-boundary=4 #64bit
gcc -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 함수 최적화 제거
gcc -fno-builtin #정적 라이브러리
<참고문헌>