Buffer Over flow 2

공부/보안 2020. 10. 16. 22:00
반응형

버퍼 오버플로우 => 버퍼가 수용할 수 있는 것보다 더 많이 입력을 받아 주변에 있는 다른 정보를 덮어쓸 수 있는 조건이다.

 

c언어에서 많이 발생한다. c언어는 쓰기 연산이 주어진 범위 내에서 일어나는지 체크하지 않는다.

 

 

 

버퍼 오버 플로우 공격 준비

 

1. 프로그램 내에 버퍼오버 플로우가 존재하는지 확인한다.

2. 실행 중인 프로세스에 굉장히 큰 입력을 주어서 그 프로그램의 실행을 추적한다.

3. fuzzing = 잠재적으로 취약하다고 생각되는 프로그램이 실제로 취약한지 아닌지를 임의의 입력을 주어서(자동으로 주입)어떻게 반응하는지 관찰하는 기법

 

메모리에 버퍼가 어떻게 저장되는지을 알아야 공격 방법을 이해할수 잇다.

 

결과로 공격자가 제어 이동이 가능하고 메모리 접근 위배를 할 수 있고 공격자가 원하는 코드 실행이 가능하다.

메모리 접근 위배 => 예로 stack에 악성 코드를 주입해서 실행한다면, 이것은 메모리 접근을 위배함. 본래 메모리 접근상 스택은 읽고 쓸 수만 있기 때문이다.

 

*버퍼 오버플로우는 스택만이아니라 다른 곳에서도 가능하다.

 

 

- 기계어 수준 : 모든 데이터는 바이트의 배열이다. 사용하는 명령어에 따라 해석된다.

- 현대 고급언어 : 대부분 strong type을 씀. 자바나 파이썬은 버퍼오버플로우에 취약하지 않음 하지만 JVM이 필요하고 속도가 느림

- c언어 : 메모리 직접접근 가능 따라서 권한이 막강하지만 버퍼오버플로우에 취약함.

 

 

버퍼 오버플로우를 막기위해 안전한 함수들을 사용함.

strncpy는 마지막에 null을 포함하지 않으므로 strlcpy를 사용하는 것이 좋다.

 

 

* strings 명령어

 

strings 명령어를 사용하면 프로그램에 있는 모든 문자열을 볼 수 있다.

따라서 실행 파일 내에 어떤 취약한 라이브러리가 있는지 확인 가능하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

공격을 하기 위해선 AT&T syntax인지 Intel syntax인지 고려하여야 된다.

또한 Big, Little endian인지도 고려하여야 된다.

 

버퍼 오버플로우는 효과적이고 원격으로도 공격이 가능하다.

 

하지만 아키텍쳐에 의존적이고 (at&t, intel or big little endian) 

운영체제에 의존적이다 => 취약한 라이브러리나 시스템콜을 사용하는가

주소를 추측해야한다. 

 

오버플로우는 ret이나 saved ebp 등을 바꾸어 공격할 수 도 있다.

 

 

 

 

 

 

방어기법

==========================================================

 

프로그래밍 언어를 자바나 파이썬을 사용한다. -> 경계체크를 하기 때문에

 

프로그램 정적 분석기를 사용한다. => 여러 개발자들이 함께 큰 프로그램을 만들었을때 사용이 편함

(SDLC => 소프트웨어 개발 생명 주기를 늘려줌)

 

 

컴파일러 수준에서는 스택가드를 사용하거나 스택 쉴드를 사용한다.

함수가 호출 될때 가드를 설정하고 함수를 리턴할때 가드가 제대로 남아있는 지 확인 한다.

(가드는 함수 호출할때 미리 설정한다.)

 

스택 쉴드는 2개의 스택을 사용한다.

리턴 주소만 저장하는 shadow 스택을 사용하여 함수가 리턴될때 call stack, shadow stack을 비교하여 일치하지 않을 경우 종료 시킴

 

 

** 스택 보호기법 해제법

 

 

 

 

 

특정한 영역을 실행 불가능하게 한다.

stack이나 heap아니 global data에 명령어가 있으면 실행하지 못하게 함(code segment는 당연히 실행해야함)

메모리 관리 장치의 도움이 필요하다.

 

 

하지만, LISP과 같이 stack에서 실행해야하는 언어들은 사용이 불가능함.

 

 

어떤 메모리 영역은 w나 x둘중 하나만 제공해줌

그것을 하버드 아키텍쳐라고 부름 코드와 데이터를 엄격히 분리 시켜줌

 

하지만 JIT과 같이 heap에서 실행해야하는 경우가 있다.

return to libc 공격을 막을 수 없음

 

 

data 영역으로 바뀔 경우 DEP가 막아주어 d 코드가 실행되지 않게 해줌

 

 

주소를 랜덤화시킴

 

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Return-tol-libc Attacks  (0) 2020.10.17
Other Overflow Attacks  (0) 2020.10.16
Buffer Overflow Attacks 1  (0) 2020.10.16
set-UID Privileged programs  (0) 2020.10.15
운영체제보안 4  (0) 2020.09.22
블로그 이미지

아상관없어

,