티스토리 뷰

pwnable

버퍼 오버플로(1)

Cand0 2019. 1. 11. 15:42

버퍼 오버플로란?


먼저 이 글은 pwnable.kr에 bof 문제를 처음 접하게 되면서 한번 정리해야 겠다는 생각이 들어 정리하게 되었습니다.


버퍼 오버플로(buffer overflow)란??


버퍼오버플로 어디서 한번쯤은 들어보셨을 것이라고 생각합니다.

버퍼오버플로에 대해서 알아보기 전에 buffer와 overflow의 사전적 의미를 알아봅시다.


   buffer 란?     데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 그 데이터를 보관하는 메모리의 영역입니다.

  overflow 란?  사전적으로 넘쳐흐른다는 뜻 입니다.

 (buffer+overflow)버퍼 오버플로 란? 할당된 메모리 영역이 아닌 다른 영역을 침범하는 공격 이라는 이야기 입니다.


  이번에는 버퍼오버플로중에서 주로 스택 오버플로에대해서 다루어 보려고 합니다.

  스택 오버플로가 나타나는 주 요인은 변수에 값을 입력할 때 경계값 검사를 하지 않아서 생기게 됩니다.


  스택 오버플로에 대해 알아보기 전에 메모리의 구조에 대해서 알아봅시다.


  메모리의 구조

다음과 같이 메모리가 구성되어 있으며,

스택의 경우에는 높은 숫자의 메모리 주소에서부터 스택이 쌓이며

힙의 경우에는    낮은 숫자의 메모리 주세에서부터 데이터가 쌓입니다.


이는 최대한 다른 메모리를 침범하지 않기 위해서 다음과 같은 방식으로 메모리가 구성되었습니다.

또한 스택의 경우에는 가장 중요한 커널을 보호하기 위해서 메모리 구조를 다음과 같이 구성되어 있습니다.



소스 코드 분석


예시1)(Stack 변수 파악)


main First와 Second 변수를 선언해주는 것을 볼 수 있습니다.

main 함수


스택에 들어가있는 값


0x7fffffffe1b0 : 0x0d0c0b0a    (10, 11, 12, 13 선언)

0x7fffffffe1b4 : 0x11100f0e     (14, 15, 16, 17 선언)


0x7fffffffe1b8 : 0x03020100     (0, 1, 2, 3 선언)

0x7fffffffe1bC : 0x07060504     (4, 5, 6, 7 선언)


이를 정리해보면 다음과 같습니다.


 이를 통해 Second에서 값을 넘치게 한다면 First의 값도 바꿀 수 있음을 유추해 볼 수 있습니다..


예시2)(버퍼 오버플로)

memory.c 파일


앞서 말씀드렸듯이 바운더리를 검사하지 않는 gets를 써서 경고가 뜨기는 했지만 성공적으로 컴파일이 되었습니다.

이제 First의 값을 변조해보죠



조금더 가시적으로 보이기 위해서 소스코드를 조금 변형해보겠습니다.


예시3)(버퍼 오버플로)

memory 소스코드


해당 파일에서는 Second 의 값만 입력해주었는데 First에 ccccdddd에도 값이 들어있는 것을 확인하실 수 있습니다.


또한 스택 오버플로를 통해 다른 함수를 실행할 수도 있는데요 이는 다음 포스팅에서 진행하겠습니다.

'pwnable' 카테고리의 다른 글

python을 통한 인자전달  (0) 2019.01.23
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함