본문으로 바로가기

해커스쿨 FTZ level9

category Wargame/FTZ 2017. 8. 21. 11:15

level9 --- apple

 

우선 level9 디렉토리의 hint 파일을 보자.

 

 

소스 코드를 아래와 같이 설명할 수 있다.

 

1. "It can be overflow : "라는 문자열을 출력한다.

2. buf 배열에 최대 40바이트만큼 키보드로 입력을 받는다.

3. buf2 배열의 문자열이 "go"인지 확인한다.

4. buf2 배열의 문자열이 "go"이면 "Good Skill\n"을 출력한다.

5. SUID 3010을 부여한다.

6. /bin/bash 셸을 실행한다.

 

level9의 문제는 버퍼 오버플로우와 관련되어 있다는 것을 알 수 있다.

 

우선 문제를 버퍼 오버플로우를 배우기전에 기본적으로 알아야할 지식을 배운후에 분석과 공격을 시도하자.

 

배열이 실제 메모리에 어떻게 배치되는지를 알아보자

 

 

위와 소스코드를 작성하고 컴파일해 실행해보자.

 

우리가 예상한 메모리 할당 크기가 다르다는것을 확인할 수 있다. 우리가 일반적으로 생각하는 크기는 sizeof로 확인할 수 있는 크기이고 실제로 메모리에 할당되는 크기는 다르다. 기본적으로 2의 배수에 해당하는 메모리 공간이 할당된다.

 

이제 문제를 파악하고 분석해보자. 우선 힌트의 소스 코드와 메모리 공간 할당 개념을 배우면 buf 배열과 buf2배열 사이의 간격이 10바이트만큼 떨어지지 않고 더 떨어져 있을 수 있다. 확인해보자.

 

 

위와 같이 %x를 사용하여 주소값을 알아보면 된다.

 

 

위와 같이 16바이트 차이가 난다는 것을 확인할 수 있다. 위의 구조를 도식화 해보면 아래와 같이 도식화 할 수 있다.

즉, 우리는 buf2 배열에 "go"라는 문자열을 채워넣어야 성공적으로 공격할 수 있다. /usr/bin/bof 파일을 보듯이 우리가 직접 buf2 배열에 값을 입력할 수 없기 때문에 buf 배열에 비정상적으로 다른 메모리를 침범하는 방식으로 buf2 배열에 접근해야한다. 이와 같은 방식을 버퍼 오버플로우 기법이라고 한다. 우리가 버퍼 오버플로우 기법을 공부하는 궁극적인 이유는 리턴 주소(RET)을 우리가 원하는 주소로 덮어써서 우리가 원하는 코드를 실행시키기 위해서이다. 즉, 우리의 마음대로 프로그램의 흐름을 바꿀 수 있다.

 

이제 공격해보자. 마찬가지로 hint 파일에서 공격할 파일을 알려주었지만 find 명령어를 이용하여 공격대상 파일을 찾아보자.

 

 

이제 공격해보자.

 

 

위와 같이 공격에 성공할 수 있다.

'Wargame > FTZ' 카테고리의 다른 글

해커스쿨 FTZ level11 (포맷 스트링 버그)  (0) 2018.08.01
해커스쿨 FTZ level10  (0) 2017.09.02
해커스쿨 FTZ level8  (0) 2017.08.20
해커스쿨 FTZ level7  (0) 2017.08.19
해커스쿨 FTZ level6  (0) 2017.08.17