2017. 6. 7. 15:42ㆍSystemHacking/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
'SystemHacking > System' 카테고리의 다른 글
[7] PLT / GOT / objdump활용법 (0) | 2017.06.14 |
---|---|
[6] Format String Bug [FSB] (0) | 2017.06.08 |
[4] 환경변수를 이용한 버퍼 오버플로우 공격 ( 에그쉘) (1) | 2017.06.05 |
[3] Buffer Overflow 공격 (0) | 2017.06.03 |
[2] 쉘 코드 작성하기 (0) | 2017.06.02 |