본문 바로가기
해킹 맛보기

메모리 오염 공격

by paysmile 2016. 12. 26.

4.7.1 메모리 오염 공격

 

메모리 오염 공격=프로그램이 개발자의 의도와 다르게 메모리를 쓰거나 읽는 행위

 

메모리 오염 공격이 일어나는 이유?

 기본적으로 사용자는 신뢰할 수 있는 착한 사람 이라는 가정이 여전히 밑바탕에 깔려 있기에 프로그래머의 의도에 대부분 맞는 프로그램 입력이 이뤄질 것으로 가정해 개발하는 경향이 있기 때문이다.

 

4.7.2 버퍼오버플로우 공격

 

버퍼오버플로우 공격= 프로그래머가 사용하려고 할당한 메모리에 저장할 수 있는 데이터보다 많은 양의 메모리를 덮어쓸 때 발생하는 버그이다.

 

인접한 메모리 영역 덮어쓰기

 

현재 사용하는 버퍼 뒷부분에 더 많은 데이터를 넣는 것이다.

 

오브 바이 원 버그

 

1의 차이로 인해 오동작하는 논리오류를 말한다.

 

예) 길이 100m의 직선 트랙에 10m간격으로 팻말을 세우려면 총 몇개의 팻말이 필요할까?

 

직관적으로는 10개가 필요해 보이지만, 시작과 끝부분에 팻말을 세우는지의 여부에 따라서 9개,10개 11개로 달라질 수 있다.

 

위의 예처럼 오브 바이 원 버그는 반복적인 연산을 수행하는 반복문 구조에서 횟수를 지정할 때 자주 발생한다.

 

더블 프리 버그

 

프로그램 구조가 복잡한 탓에 메모리를 어디서 해제해야 되는지를 프로그래머가 착각해 코드배치를 잘못했을 경우에 함수가 두 번 이상 같은 메모리에 호출되어 발생한다.

 

예) 한 메모리가 서로 다른 두 스트링으로 사용되는데 한 곳에서는 길이를 a로, 다른 한 곳에서는 길이를 b로 제한해서 사용한다고 가정. 이때, 큰 쪽으로 메모리를 채우고 작은 쪽에서 사용하게 하면 상대적인 길이 차이로 인해 버퍼오버플로우를 발생시킬 수 있다.

 

스택영역

 

스택 세그먼트는 CPU가 프로그램 함수를 실행하는 동안 필요한 정보를 저장하는 메모리 영역이다. 이 영역에는 함수 인자, 지역 변수, 스택 프레임 주소와 리턴 주소도 저장한다.

 

스택 기반의 오버플로우는 함수의 지역 변수가 저장되는 메모리에서 주로 발생합니다.

 

예)

#include <stdio.h>

#include <string.h>

 

const int kBufSize = 16;

 

int main(int argc, char* argv[]) {

char buf_one[kBufSize] = "Hello";

char buf_two[kBufSize] = "World"l

 

strcpy(buf_two, argv[1]);

 

printf("&buf_one = %p, content = %s\n", &buf_one, buf_one);

printf("&buf_two = %p, content = %s\n", &buf_two, buf_two);

 

return 0;

}

 

나중에 선언한 buf_two가 buf_one보다 더 앞쪽 메모리를 차지하기 때문에 입력을 buf_two에 복사했다.

 

 

 

 

'해킹 맛보기' 카테고리의 다른 글

명령어 삽입공격&레이스 컨디션  (0) 2016.11.22
웹 해킹  (0) 2016.11.01
리버싱 스터디3  (0) 2016.10.11
리버싱 스터디2  (0) 2016.10.11
엔지니어링 스터디1  (0) 2016.10.11