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 |