[5] Heap Buffer Overflow ( Heap기반의 버퍼오버플로우 )

2017. 6. 7. 15:42SystemHacking/System

 

 

 

버퍼오버플로우공격은 Heap기반과 Stack기반으로 나뉘어집니다

Stack기반의 버퍼오버플로우공격은 1~4 게시글에서 공부했고 이번에는 Heap기반의 버퍼오버플로우 공격에 대해서 알아보겠습니다

힙 오버플로우란 힙 데이터 영역에서 일어나는 버퍼 오버플로우로써 스택기반 오버 플로우와는 다른 방법으로 공격합니다

힙 오버플로우 기술은 동적 메모리 할당 연결을 덮어 씀으로써 프로그램의 함수 포인터를 조작합니다

방식 : 버퍼오버플로우시켜 접근해 포인터가 가르키는 값을 변경하여 임의의 파일에 접근하거나 임의의 코드를 실행시킨다



예제를 만들어서 설명하겠습니다


[$vi /tmp/heap1.c]

[ 그림1 ]


컴파일 후 인자로 HELLO 를 넣고 실행시켜보겠습니다


[ 그림2 ]


동적할당 시켜준 buf와 datafile의 주소를 봐보겠습니다

buf : 0x00b07010

datafile : 0x00b07080

스택기반에서는 큰수에서 작은 수로 스택이 할당되지만 힙기반에서는 작은수에서 큰수로 올라가면서 주소가 할당됩니다


두개의 변수사이의 거리는 0x70 입니다. ( datafile - buf == 112byte )

프로그램을 실행한다면 다음과 같은 힙 구조를 가지고 있을겁니다

[힙구조]

buf (100byte)

dummy (12byte)

datafile (10byte)

 argv[1]

 쓰레기값

 "/tmp/note"



그럼 힙 버퍼오버플로우 공격을 해보겠습니다. 112byte를 버퍼오버플로우 시키면 되겠죠?


[ 그림3 ]


112byte만큼을 "A"로 채운다음 " /etc/passwd " 를 입력했습니다. 아래와 같은 구조가 됩니다


[힙구조]

buf (100byte)

dummy (12byte)

datafile (10byte)

"A"*100

"A"*12

"/etc/passwd"


실행결과는 아래와 같습니다 ( /etc/passwd 파일안에 인자값이 입력되어 질겁니다 )


[$cat /etc/passwd]

[ 그림4 ]


포인터 " datafile "이 가르키는 파일은 " /etc/passwd "입니다.

따라서 /etc/passwd 파일에 인자로 준 ""A"*112+"/etc/passwd"" 가 입력되어집니다


그럼 /etc/passwd 에 실제 계정을 만들어보도록 하겠습니다


[ 그림5 ]


포인터 " datafile "은 " /etc/passwd "를 가르키고 있습니다.

프로그램이 실행되면 인자로 들어오는 해당 문자열을 " /etc/passwd " 에 입력시킵니다

프로그램의 실행결과를 확인해보도록 하겠습니다


[$cat /etc/passwd]

[ 그림6 ]


해당 계정으로 로그인 하려고하면 오류가 납니다

" /bin/shAAAAA.../etc/passwd " 라고 하는 배시쉘은 없으니까요

따라서 우리는 " USERID::.../root:/bin/sh " , " AAAA.../etc/passwd " 두 문자열을 분리시켜서 입력시켜야 합니다

개행문자(\x0a)를 사용하겠습니다. 여기서 주의사항이 있습니다


[ 그림7 ]


입력한 명령어가 개행문자 이후의 문자들을 무시해버리는 문제가 발생했습니다

root@Server-A tmp]# ./heap1 "`python -c 'print "USERID2::0:0:COMMENT:/root:/bin/sh"+"\x0a"

여기까지만 프로그램의 인자로 인식됩니다. 그래서 버퍼오버플로우가 발생되지 않아서 datafile포인터가 /tmp/note를 가르키고있습니다


이 문제를 해결할 수 있는 방법은 쌍따옴표입니다 ( " )

root@Server-A tmp]# ./heap1 "`python -c 'print "USERID2::0:0:COMMENT:/root:/bin/sh"+"\x0a"+"A"*77+"/etc/passwd"'`"

쌍따옴표 안쪽에 있는 문자들을 하나의 문자로 인식되 하나의 인자로 사용되어 프로그램이 실행됩니다 ( argv[1] )


[ 그림8 ]


인자가 제대로 입력되어서 버퍼 오버플로우를 일으켜 " datafile "포인터가 " /etc/passwd "를 가르키고 있습니다


[#cat /etc/passwd]

[ 그림9 ]


해당 계정으로 로그인 해보겠습니다.


[ 그림10 ]


해당 계정은 정상적으로 로그인 됩니다. 


Heap기반의 버퍼오버플로우 설명을 마치겠습니다.


참고한 사이트 http://m.blog.naver.com/2000sky2/220626020503