Security/시스템 해킹(PWN, System)

공부하는데 필요할 GCC 메모리 보호기법 해제

그믐​ 2022. 6. 1. 20:47
반응형

포너블을 하는데 있어서 스스로 코드를 만들어보고 분석해볼 필요가 있을 거 같아 메모리 보호기법 해제에 대한 글을 올립니다.

 

적혀있는 코드들은 해당 기법을 제거하는 컴파일 옵션입니다.

 

 

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 #정적 라이브러리

 

 

<참고문헌>

 

https://realsung.tistory.com/199

https://kimdora.tistory.com/entry/LINUX-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%B3%B4%ED%98%B8-%EA%B8%B0%EB%B2%95

반응형