티스토리 뷰


Buffer Overflow Shell Code 이용 공격



1. Buffer Oerflow 개요 

프로그램 취약점을 이용해 할당된 메모리 공간보다 더 큰 범위를 입력하여 프로그램 흐름을 바꾸거나 원하는 명령을 실행할 수 있다.

 

길이 검증을 하지 않는 함수 사용시 buffer Overflow 공격이 가능하다.


 

길이 검증을 하지 않는 함수들

취약 함수

strcpy(), strcat(), sprintf(), csprintf(), gets(), scanf()

 

STACK은 함수 사용시 이전 위치로 복귀하기 위해 RET SFP 값을 입력하고 STACK FRAME을 만든다. RET는 복귀할 위치의 다음 실행주소 코드를 넣고, SFP는 복귀할 위치 EBP 위치를 백업해 놓는다.

해당 함수가 종료되면 에필로그 과정이 이루어 지는데 이때 SFP 값을 참조하여 EBP값을 변경하고

RET 값을 이용하여 이전 함수의 실행위치로 돌아간다. Overflow를 이용해RET값을 변조시켜 원하는위치로 이동할 수 있다

Gets 함수 사용시 길이검증을 하지 않아 buffer1 공간을 넘어 SFP RET 을 변조하게 되어 프로그램 흐름을 변경 할 수 있다.



2. Shell Code이용 공격

 

[환경 요약]

OS

Kali 1.0

파일

/tmp/test.c

ASLR

X (echo 0 > /proc/sys/kernel/randomize_va_space)

N/X

gcc -o test test.c -fno-stack-protector -z execstack -fno-builtin -mpreferred-stack-boundary=2

취약점

Strcpy 함수 이용


일반 shellcode 삽입 공격을 하기 위해 시스템 환경을 변경하였다.

Shellcode가 스택에서 실행되기 위해선 N/X 해제 상태여야 한다.

버퍼 오버플로우에 취약한 프로그램 작성. /tmp/test.c


 

[그림  – bufferoverflow에 취약한 프로그램 소스]

 


 

[그림 – bufferoverflow에 취약한 프로그램 준비]

 

간단하게 인자 값을 출력하는 프로그램이다. argv[1] 의 인자값이 strcpy 함수에 들어가 buf 주소 공간에 문자열 복사가 된다이때 strcpy는 길에 검증을 하지 않기 때문에 buf 크기인 100 byte 이상 입력될 시 SFP, RET 공간을 침범하게 된다.

 

Test 일반 유저로 전환 후 test2 파일로 복사해 GDB로 디버깅을 시도해 보았다.

 

[그림 – GDB분석 1]


 

[그림 - GDB분석 2]


그림 같이 strcpy 실행 전에 break point를 걸고 ESP 값을 확인 하였다

해당 함수가 실행하기 위해 인자값을 스택에 올리고 strcpy 함수를 call 하는데 call 이전에 스택에 인자값을 확인하여 buf 주소와 argv[1] 주소를 확인할 수 있다.

 

Strcpy 함수 실행 후 스택 변화된 모습이다.


 

[그림스택 구조]


 

[그림 – GDB 분석 3]


Buf 크기 100byte + SFP (4byte) + RET(4byte)

Buf = aaa , SFP = bbbb, RET= CCCC

RET 변조로 인해 0x63636363 위치를 찾을 수 없는 에러를 확인 할 수 있다.

추가적으로 info reg 명령어를 사용하여 eip 값을 확인할 수 있다


 

[그림 – GDB 분석 4]


이제 CCCC 대신 shellcode를 삽입하여 시작주소를 RET 위치에 넣으면 shellcode를 실행 시킬 수 있다.

* ARGV[1] 인자값 변경

(gdb) r $(python -c 'print "a"*100+"bbbb"+"cccc"';)

쉘코드 크기가 41byte이므로 shellcode(41byte)+”a”(59byte)로 변경한다.

0xbffff644 위치부터 buf의 시작위치를 확인 할 수 있으므로 RET값에 0xbfff644값을 넣으면 shellcode의 시작위치로 이동할 수 있다.

- 쉘코드 삽입 후

(gdb) r $(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"a"*59+"bbbb"+"\x44\xf6\xff\xbf";’)




 

GDB 분석 5



 

GDB 분석 6


Shell 획득 성공 확인.

공격 코드 그대로 setuid가 걸려있는 test 파일에 시도해 보았다.


 

[그림 – shellcode 공격]

 

SETUID가 걸려있는 /tmp/test 파일에서 shellcode를 삽입하여 공격한 결과 root 권한을 획득할 수 있다




Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday