스택 버퍼 오버플로우 공격은 모든 경우에 가능하지 않고 프로그래머가 취약한 특정 함수를 사용해야 가능하다. 다음 예를 통해 스택 버퍼 오버플로우 공격을 실습해보자.


stack1.c 파일을 다음과 같이 작성을 하고 다음 명령으로 컴파일을 한다.

gcc -o stack1 stack1.c -m32 -fno-stack-protector 

그러면 위와 같이 stack1 실행파일이 생성된다.


먼저 stack1.c의 코드를 분석하면 다음과 같다.

1. modified 변수와 buffer 변수가 있다.

2. buffer의 크기는 64바이트이다.

3. 프로그램을 실행할 때 인자가 없으면 에러를 뱉어내고 종료한다.

4. modified 변수를 0으로 초기화한다.

5. 실행 시 받은 인자를 buffer에 복사한다.

6. modified의 값이 0x61626364이면 공격 성공

7. 그렇지 않으면 공격 실패


분석을 통해 알아낸 것은 modified 변수의 값은 절대 0x61626364 값을 가질 수 없는데 이 값을 가지고 분기를 한다는 사실과 buffer의 값을 프로그램 실행 시 입력을 받는 다는 것 그리고 buffer의 크기가 64바이트라는 것이다.

즉, buffer에 오버플로우를 일으켜 modified 변수를 변조시켜야 한다는 것이다.

다음 명령으로 공격을 해보자.

./stack1 `python -c 'print "A"*64 + "dcba"'`


공격이 성공한 것을 확인할 수 있다.


왜 이러한 현상이 발생하는지 그 원리를 살펴보도록 하자.

위 코드에서 strcpy로 buffer에 데이터를 저장한 뒤의 스택 상황은 위와 같다.

buffer에 64바이트 만큼 A가 채워지고 dcba가 modified 영역에 저장이 된다.

즉, 오버플로우가 발생해서 다른 변수에 영향을 주는 것이다.


이렇듯 strcpy와 같이 오버플로우에 취약한 함수를 사용하는 프로그램에 대해 버퍼 오버플로우 공격을 수행할 수 있다.

'NCS보안3기 > 시스템 해킹' 카테고리의 다른 글

[System Hacking] 메모리  (0) 2017.05.16
[System Hacking] CPU와 레지스터  (0) 2017.05.16
[System Hacking] 운영체제  (0) 2017.05.15
Posted by Imp3rio