본문 바로가기
파이썬 스터디 과제/파이썬 해킹 프로그래밍

8장-퍼징

by laoching 2015. 2. 10.
728x90
반응형

퍼징은 소프트웨어에 있는 버그를 찾아내는 가장 효과적인 기술이라고 한다.

퍼징은 애플리케이션이 에러를 발생하게 만들기 위해 비정상정인 데이터를 만들어 애플리케이션에 전달하는 방법이다.

퍼저의 두 형태

제너레이션 퍼저

- 새로운 데이터를 생성해 대상 애플리케이션에 전달

뮤테이션 퍼저

- 기존의 데이터를 이용해 대상 애플리케이션에 전달

예) 제너레이션 퍼저는 비정상적인 HTTP 요청을 생성해 대상 웹서버 데몬에 전달한다.

    하지만 뮤테이션 퍼저는 기존의 HTTP 패킷 데이터를 캡처해 변형시킨 후 웹서버 데몬에

    전달한다.


버그의 유형

버퍼 오버플로우

모든 종류의 메모리 관련 함수, 문자열 처리 루틴, 프로그래밍 언어 자체의 내부 기능조차도 버퍼 오버플로우를 일으켜 소프트웨어를 취약하게 할 수 있다고 한다.

버퍼 오버플로우는 데이터를 저장할 메모리 영역보다 더 큰 데이터가 저장될때 발생한다.

데이터의 양이 많으면 버퍼가 넘치게 되고 그러면 메모리가 샌다.

버퍼오버플로우는 두 가지로 분류된다.

스택기반의 오버플로우

힙 기반의 오버플로우


스택 오버플로우

- 스택에 데이터를 덮어써 코드 실행 흐름을 변경하는 것

- 스택 오버플로우의 발생 여부를 퍼징과정에서 쉽게 발견할 수 있다.

힙 오버플로우

- 애플리케이션이 실행되면서 동적으로 메모리를 할당하는 영역인 프로세스의 힙 세그먼트 내에서 발생한다.

- 힙 오버플로우가 발생하면 오버플로우가 발생한 곳과 인접한 메모리 블록의 메타데이터가 덮어써지게 된다.

메타 데이터란? - 데이터에 대한 데이터

- 퍼징 과정에서 발견하기 힘들다.

이유 - 접근 위반 예외가 발생하지 않아서


정수 오버플로우

정수 오버플로우는 프로세서가 컴파일러에 의해 만들어진 부호 있는 정수를 이용해 수행하는 산술 연산 과정을 교묘히 이용했을 때 발생하는 오버플로우다.

정수 오버플로우는 부호 있는 정수가 가질 수 있는 값의 범위를 벗어난 값이 저장될 때 발생된다.

메모리를 너무 작게 할당해도 버퍼 오버플로우가 발생할 수 있다.

첫 번째 명령은 [ESP + 0x8]의 값을 EAX에 저장하는 것이다.

두 번째 명령은 EAX 레지스터의 값에 0x24를 더해 EDI 레지스터에 저장한다.

그리고 EDI 레지스터의 값을 메모리 할당 함수인 malloc 함수의 인자로 사용한다.

mov 와 lea의 차이점

mov는 value값을 옮기지만 lea는 address값을 옮긴다.

만약 EAX 레지스터에 부호 있는 정수의 최댓값이 저장되면 0x24가 더해져 오버플로우가 발생된다.

위 리스트와 같은 경우가 발생하면 malloc 함수는 개발자가 원래 할당하고자 했던 크기보다 훨씬 작은 0x19바이트 크기의 메모리를 할당하게 된다.

할당한 크기가 작아 버퍼오버플로우가 발생하게 된다.


포맷 스트링 공격

포맷 스트링 공격은 공격자가 C 함수인 printf 함수 같은 문자열 처리 루틴에 형 지정자로 취급되는 문자열을 입력해 악용 하는 것이다.

printf 함수의 프로토 타입

printf 함수에는 형을 지정하는 문자열이 첫 번째 파라미터로 전달되고 지정된 형의 값을 표현하기 위한 파라미터가 추가로 전달된다.

%d 는 형 지정자다. 

만약 지정된 형의 값을 전달하기 위한 파라미터를 빼먹고 printf 함수를 호출했다면 다음과 같은 형태의 결과를 얻게 될 것이다.

printf 함수에 형 지정자만을 전달하면 함수 내부적으로는 전달된 형 지정자를 파싱하고 지정된 형의 값을 산출하기 위해 스택의 값을 이용하게 된다.

파싱이란? - 가공되지 않은 데이터에서 원하는 특정한 문자열을 빼내는 작업

%s 형 지정자를 사용하면 문자열 처리 함수에서는 문자열의 끝을 나타내는 NULL 바이트를 만날 때까지 메모리상의 문자열을 스캔한다.

이는 용량이 큰 데이터에서 특정 주소에 저장된 것을 읽어 들이거나 애플리케이션이 접근하면 안되는 메모리를 읽게 만들어 에러가 발생하게 만드는 데 유용하게 사용할 수 있다.

%n 형 지정자는 형을 지정하지 않고도 메모리에 데이터를 쓰는 것을 가능하게 한다는 점에서 매우 독특하다.

이 점을이용해 공격자는 리턴주소나 기존 루틴의 주소 값을 갖고 있는 함수 포인터를 덮어써 자신의 코드가 실행되게 만들 수 있다.


728x90
반응형

댓글