메모리 보호기법

noob3er·2023년 1월 4일
0

System Hacking

목록 보기
4/5
post-thumbnail

메모리 보호기법

메모리 보호기법 확인

  • $checksec --file=[filename]
  • gdb 실행 후 "checksec"으로 확인 가능



ASLR(Address Space Layout Randomization)

  • 실행파일과 관련된 공유 라이브러리, 스택, 힙이 매핑되는 메모리 영역의 주소를 랜덤으로 배치하는 것
  • 실행할 때마다 영역의 주소가 랜덤적으로 계속 변경됨
  • 이를 통해 공격자가 고정된 주소를 이용하여 실행 흐름을 변경하거나 원하는 데이터를 가져오는 것을 막음
  • 우회방법 : 메모리 릭(leak)을 통해 우회
  • /proc/self/maps을 통해 확인 가능
  • vmmap으로 확인 가능

NX(No-eXecute)bit

  • 스택, 힙, 데이터 영역에서 코드가 실행되는 것을 막는 기법
  • 윈도우에서는 DEP(Data Execution Prevention)이라 부름
  • Shellcode로 인한 공격을 막을 수 있음
  • NX가 걸려있으면 mprotect함수 이용, RTL, ROP 기법으로 우회
  • 컴파일 옵션 : -z execstack으로 NX bit를 Disable할 수 있음
  • 우회방법 : 프로그램에 스택 버퍼 오버플로우가 존재한다면, 실행 흐름을 임의의 주소로 바꾸는 것은 여전히 가능하다. NX bit가 적용되어 있는 상황에서 스택 메모리 등으로 실행 흐름을 직접 바꾸어 공격하는 것은 불가능하기 때문에, 메모리의 실행 가능한 영역에 있는 코드들을 활용해서 익스플로잇해야 한다.

SSP(Stack Smashing Protector) - Stack Canary

  • 스택 버퍼 오퍼플로우를 막기 위한 방법
  • Buffer와 SFP 사이에 랜덤한 (4/8)바이트 Canary 값을 삽입
  • 함수 진입시 카나리 값을 설정하고 함수 종료시 변조 됐는지 확인(변조 됐으면 프로그램 종료)
  • 우회방법 : 메모리 Leak(유출을) 통해 우회, 무차별 대입(Brute Force) 등
  • 무차별 대입으로 x64 아키텍처의 카나리 값을 알아내려면 최대 256^7번, x86 에서는 최대 256^3 번의 연산이 필요하다. 연산량이 많아서 x64 아키텍처의 카나리는 무차별 대입으로 알아내는 것 자체가 현실적으로 어려우며, x86 아키텍처는 구할 순 있지만, 실제 서버를 대상으로 저정도 횟수의 무차별 대입을 시도하는 것은 불가능하다.

RELRO(RELocation Read-Only)

  • GOT Overwirte 공격에 대비하여 ELF 바이너리 또는 프로세스의 데이터 섹션을 보호하는 기술
  • 간단하게 생각하면 메모리 특정 영역을 덮어 쓸 수 없도록 함
  • PARTIAL-RELRO : ctors, dtors, dynamic Section Read-Only
  • FULL-RELRO : got Section Read-Only
  • 컴파일 : -z norelro(NO-RELRO), -z relro(PARTIAL-RELRO), -z relro –z now(FULL-RELRO)
  • 우회 방법 : Full RELRO는 Got Overwrite가 안됨으로 Base libc 상대주소(offset)를 통해서 우회

PIE(Position-Independent Executables)

  • 바이너리 영역의 주소를 랜덤화, 실행마다 바이너리 영역의 주소가 변경됨
  • ASLR와 PIE는 다름(ASLR은 OS 옵션, PIE는 컴파일 옵션으로 바이너리에 적용)
  • 0x400000에 매핑되는 일반적인 바이너리와 다르게 Base Address가 매번 바뀜
  • 컴파일 옵션 : -no-pie(PIE 해제), -fpie –pie(PIE 설정)
  • 우회 방법 : 메모리 릭(leak)을 통해 우회
profile
"Hard work beats talent when talent doesn't work hard."

0개의 댓글