ID : level9

password : apple

 

1) 역시나 hint 내용을 읽어보니 소스 코드가 나왔다.

2) 역시나 setuid 가 걸려있는 파일도 해당 파일이다.

그럼 

/usr/bin/bof

파일에 대한 내용을 확인해보자 

 

3) it can be overflow : 

라는 문구가 나왔다. 그 전에, 해당 소스 코드를 분석하도록 하자

 

1. 입력받은 문자열의 40 만 받아 온다.

2. 여기서 10 크기만큼만 buf[버퍼] 에 내용이 담긴다

3. buf2[버퍼2] 의 처음 2글자가 "go" 라면, 사용자와 그룹권한을 level10 으로 바꾸고, 프롬프트와 쉘을 출력하게 한다

 

 

코드를 해석해보니 어떻게 풀면 되겠는지 느낌이 왔다.

BOF - 버퍼오버플로우 공격이다.

 

buf 는 10글자만 받아 들이지만, 이를 초과할경우 흘러 넘쳐

자연스레 buf2에 들어가게 될것이고, 처음 두 글자가 go 가 되면 말그대로 권한이 뚫리게 되는 문제이다.

 

해당 코드가 공개되어 있으니 해당 코드를 복사하여 새로운 파일을 만들어 보자 

4) 관리자 권한으로 파일 생성이 막혀있다.

그럼 임시파일을 저장하는 cd tmp 로 이동하여 파일을 생성해 보자

 

5) 프로그램 코드 작성을 완료 했으면 Ctrl + d 를 동시에 입력하여 저장한후 컴파일을 한다.

 

6) 프로그램 컴파일이 완료 되었다. 

버퍼 오버플로 공격을 이행하기 위하여, 해당 코드를 어셈블리어를 확인하기위해

gdb 명령어를 사용하여 어셈블리어로 변환해 보자

 

7) gdb 프로그램명 

을 입력한후 , disas main 을 추가 입력하여 

main 함수에 대한 내용을 살펴보도록 하자.

 

8) 빨간색 박스를 보면 buf , buf2 의 변수가 할당되는 것을 볼수있고, 

이러한 변수가 저장되는 주소인

0x0804844e  - Buf

0x08048464 - buf2

임을 알수 있다. 16진수의 표현이기 때문에 이를 변환하여 그 차이를 계산하면

16이 된다.

중간에 표시된 파란 박스는 예측하건데 dummy가 들어가는 공간으로 추측할수 있을것이다.

즉, 쓰레기값이 들어가는 공간이므로 무시하고 buf2 와 buf1 의 차이인 16자리를 채우고, 

buf2 가 시작되는 주소부터 go 를 입력되게 하면 

level10의 권한을 얻을수 있을것이다.

 

9) 16자리를 아무 문자나 채우고 go 를 입력하니

Good Skill! 이라는 문구와 함께

level10의 권한을 획득 하게 되었다.

 

비밀번호를 알아내기 위해 my-pass 를 입력하면

 

10) level10의 비밀번호가 출력되었다

"interesting to hack!"

 

BOF 공격에 대한 문제이므로 

달고나문서의 버퍼 오버플로우 공격 문서를 참조하면 이해가 쉽게 될것이다.

 

+ Recent posts