Be myself :: 스택 보호기법

달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

스택 보호기법

Exploit 2014. 9. 22. 16:16

1 개요

여러가지 스택 보호기법들에 대해 공부했었는데 자꾸 잊어버려서 정리할 필요가 있다고 생각되어 정리하게 되었다.

 

2 NX(데이터 실행 방지)

Nx bit를 활성화 시켜 스택이나 힙영역의 실행권한을 없애서 쉘의 실행으로부터 보호하는 기법이다. 이를 우회하기 위한 방법으론 대표적인 것이 RTL공격(공유라이브러리 이용 ldd로 확인 가능하다.)이다.
NX비트가 활성화 되어 있는 지는 다음과 같이 확인이 가능하다.

2. ASLR

ASLR(Address space layout randomize)는 프로그램이 가상메모리에 mapping 될 때 그 base address의 주소를 랜덤으로 돌려서 공격을 어렵게 하는 방어기법 이다
1. Echo 0 > /proc/sys/kernel/randomize_va_sapce (ASLR 끔)
2. Echo 1 > /proc/sys/kernel/randomize_va_szpce (ASLR ON -> stack randomize)
3. Echo 2 > /proc/sys/kernel/randomize_va_szpace (ASLR ON -> stack, heap, mmap randomize)

2-1 우회방법

여러 가지가 있을 수 있다.

1. Brute Force
특정한 때 쉘이 위치할 주소 값을 하드코딩 한 다음 계속 공격하는 것이다. 구버전 리눅스의 경우 스택의 크기가 크지 않아 가능한 공격이다. NOP를 충분히 넣어주면 빠르게 공격이 가능하다. 하지만 64bit시스템이나 최신버전에선 좀 힘들다..

2. Jmp *esp, call *esp
명령어를 보자 마자 무슨 뜻인지 알 것이다. 잘 모르겠다는 사람은 본인이 전에 올린 블로그 글을 참고하길 바란다. 이 명령어를 text명령어나 공유라이브러리에서 찾는 방법은 gdb에서 [ find /h (메모리 시작주소), (메모리 끝 주소), 명령어 ] 이렇게 찾으면 된다. 혹은 msfelfscan 툴을 이용하면 된다.
이 때 주의할 점은 RTL을 통해 공격하는 것을 막기 위해 라이브러리 마저 Random으로 돌아가는 경우이다.

3. RET Sledding
RET sledding을 하게 되면 주소 값과 상관 없이 스택에 위치한 값들을 이용하기 때문에 공격이 가능하다.

* Bypassing random library

1. Brute Force
구버전의 리눅스의 경우에 공유라이브러리 주소가 아래의 그림과 같이 랜덤으로 변한다 하더라도 같은 주소로 맵핑되는 경우가 많다 보니 Brute force공격이 가능하다.

 

3 Stack guard, stack shield

컴파일러나 링커에 의해 스택을 보호하는 기법이다. RET의 값을 어느 곳에 저장해 두었다가 프로그램이 끝날 때 ret의 값을 비교해 처음과 다르다면 비정상 종료시키는 것이 stack shield이고 SSP에 의해 canary의 값을 넣어주는 것이 stack guard 이다.

*canary의 종류
1. Random canary: /dev/urandom 에 의해 생성되는 랜덤의 값
2. Terminator canary : NULL이나 CR(0xd), LF(0xa), EOF(0xff)와 같은 값을 포함하여 canary의 값을 알더라도 페이로드를 정장적으로 작성할 수 없도록 한다.

우회 방법으로는 memory leak이 일어나는 곳을 찾아서 카나리 값을 직접 알 수 있으면 제일 좋다. (물론 프로그램이 실행 할 때마다 카나리 값이 변하지 않는다는 가정이 있어야 하겠지만)

4 Ascii armor

공유라이브러리의 주소 값의 최상위 비트가 0x00이 위치해 페이로드를 구성 할 수 없도록 하는 기법인데 RET sledding이나 fake ebp로 우회 가능하다. 또는 ascii armor의 보호를 받지 않는 PLT영역의 주소 값을 이용해서 GOT를 overwrite 시켜 공격하는 방법이 있다.

'Exploit' 카테고리의 다른 글

elf의 보호기법 파악  (0) 2014.10.09
메타스플로잇을 이용한 쉘코드 작성  (0) 2014.10.03
Double free exploit  (0) 2014.09.17
RTL을 이용한 쉘코드 작성  (3) 2014.08.02
유니코드 익스플로잇  (0) 2014.07.21
Posted by flack3r
|