본문 바로가기

System Security/Technology

메모리 보호 기법

Checksec.sh

실행 파일에서 제공하는 보안 매커니즘을 알기 쉬운 형태로 표시해주는 쉘 스크립트로 메모리 보호 기법인 PIE, RELRO, Canaries, ASLR, NX bit 등을 확인하는 데 사용되는 툴

https://github.com/slimm609/checksec.sh

 

GitHub - slimm609/checksec.sh: Checksec.sh

Checksec.sh. Contribute to slimm609/checksec.sh development by creating an account on GitHub.

github.com

 

Checksec.sh은 실행 파일에 어떤 메모리 보호 기법이 적용되어 있는지 확인할 수 있는 기능을 제공하는 툴입니다. 

이 페이지는 RELRO, SSP, NX bit, ASLR, PIE 메모리 보호 기법에 대해 다룹니다.  

RELRO (RELocation ReadOnly)

RELRO는 메모리에 배치된 데이터의 어느 부분에 대해 ReadOnly 속성을 부여할 것 인지를 결정합니다. 

이는 No RELRO, Partial RELRO, Full RELRO 총 3가지가 존재하며, CTF에서 GOT Overwrite 공격을 수행할 수 있는지 확인하기 위해 사용합니다. 

 

GOT Overwrite 공격이 성공하려면 No RELRO, Partial RELRO 여야 한다. Partial RELRO의 경우에는 RELRO 자체는 설정되어 있지만, 공유 라이브러리 함수를 처음 호출할 때 함수의 주소를 캐시 할 공간을 확보하기 위해 GOT 영역이 쓰기가 가능하게 되어 공격을 수행할 수 있게 됩니다.

 

GOT Overwrite 공격에 대해 궁금하다면? GOT Overwrite 공격

 

Stack Smash Protection (Carnary)

Stack Smash Protection(SSP)는 스택 위에서 발생하는 버퍼 오버플로우를 막기 위한 장치로 스택 프레임의 로컬 변수 영역과 Saved EBP 사이에 Carnary라는 값을 넣어 함수가 종료될 때 그 값이 Overwrite 되었는지를 판별하여 버퍼 오버플로우 공격을 검출하는 메모리 보호 기법입니다. 

...(낮은 주소)
local variables
canary
saved ebp
return address

NEXT STACK Frame
(높은 주소)

위 그림은 스택 영역으로, Stack Smash Protection 메모리 기법이 켜져 있는 경우 스택 프레임에 SFP(saved ebp)와 Local variables 사이에 Carnary 값이 존재하게 되고, 함수가 종료될 때 기존의 Carnary 값이 바뀌었는지 확인하는 과정을 거쳐 버퍼 오버플로우 공격을 감지하게 됩니다. 만약 버퍼 오버플로우가 감지되었을 경우, 해당 프로그램은 강제로 종료하게 됩니다. 

 

Carnary 값은 현재 난수 값이 사용되지만, 메모리 위에서 앞이 Null Byte가 되는 값이 설정되어, 로컬 변수에 할당한 문자열이 Null bytes로 끝나지 않았을 때 문자열 출력으로 Carnary가 유출되는 것을 방지하는 효과가 있습니다. 

 

현재 많은 컴파일러들은 Stack Smash Protection 메모리 기법을 사용하고 있지만, gcc에서 -fno-stack-protector 옵션을 사용하여 Stack Smash Protection 메모리 기법을 종료시켜 컴파일할 수 있습니다. 

 

스택 프레임(Stack Frame)에 대해 궁금하다면? StackFrame

 

NX bit (No eXecute bit) 

윈도우의 경우에는 DEP(Data Execution Prevention: 데이터 실행 방지)라고도 하며, 메모리상에서 실행될 필요가 없는 데이터를 실행 불가능하도록 설정하여 공격자가 셸 코드(Shellcode)를 사용해 공격하는 것을 어렵게 하는 메모리 보호 기법입니다. 

 

임의 코드 실행을 방해하기 때문에 NX bit가 활성화된 환경에서 공격을 수행하는 경우, 실행 가능 코드를 파편화한 뒤 그것을 조합하여 공격하는 방법을 취하거나 RTL(Return to libc) 공격을 통해 위 메모리 기법을 우회할 수 있습니다.

 

NX bit 메모리 기법을 사용하지 않고 컴파일 하기 위해서는 gcc 컴파일을 할 때 -z execstack 옵션을 사용해주면 됩니다. 

 

NX bit 메모리 보호 기법을 우회하는 RTL 공격이 궁금하다면? (추후 업데이트 예정)

ASLR (Address Space Layout Randomization) 

스택과 힙, 공유 라이브러리 등을 메모리에 적재할 때 주소의 일부를 랜덤화해서 공격자가 주소를 추측하기 어렵게 만드는 메모리 보호 기법입니다. 

 

ASLR OFF

$ sudo sysctl -w kernel.randomize_va_space=0

ASLR ON 

$ sudo sysctl -w kernel.randomize_va_space=2 

 

ASLR 메모리 보호 기법 우회하는 방법이 궁금하다면? (추후 업데이트 예정)

PIE (Position Independent Executable) 

실행 코드 내의 주소 참조를 모두 상대 주소로 만들어 실행 파일이 메모리의 어느 위치에 위치하더라도 성공적으로 실행될 수 있게 합니다. 공유 라이브러리에는 자주 적용되는 옵션이지만, 실행 파일을 메모리에 적재할 때 위치를 임의적으로 결정할 수 있기 때문에 ASLR 메모리 보호 기법으로는 할 수 없는 실행 파일의 위치 주소를 무작위로 만들 수 있습니다. 

 

Exploit을 수행할 때 기본적으로 메모리 누수(Memory leak)로 부터 공격을 시작하게 됩니다. 

 

메모리 누수(Memory Leak)가 궁금하다면? (추후 업데이트 예정)

 

참고 문헌

[1] 양현 옮김, CTF 정보보안 콘테스트 챌린지북』, 위키북스(2016), p106-109.

'System Security > Technology' 카테고리의 다른 글

CTF Tools  (0) 2022.02.13
Use after free  (0) 2022.01.23
GOT Overwrite  (0) 2022.01.22
NOP Sled  (0) 2022.01.19
스택 프레임(Stack Frame)이란?  (0) 2022.01.18