1. 풀이

- hint 파일의 내용을 보면, 256byte의 str 배열 선언 후, level13의 권한 부여 및 gets()로 사용자에게 입력을 받음

- gets()에는 다음과 같은 취약점이 존재함

- 즉,  256byte의 크기를 지니고 있음에도 불구하고, gets()는 문자열의 길이를 검사하지 않고 문자열을 입력므로, BOF(버퍼 오버플로우)에 취약한 함수

- attackme 파일을 tmp로 복사한 후 gdb로 attackme 파일을 분석해보면 다음과 같음

 

① Procedure Prelude

0x08048473 <main+3>:    sub    $0x108,%esp

- 지역변수에 0x108(264) 만큼의 공간을 할당

- str 배열의 크기는 256byte이므로 8byte 만큼의 dummy가 존재하는 것을 알 수 있음

 

② setreuid(0xc15,0xc15)

0x0804847c <main+12>:   push   $0xc15
0x08048481 <main+17>:   push   $0xc15
0x08048486 <main+22>:   call   0x804835c <setreuid>

- level13의 권한 부여

 

③ gets(문자열이 저장될 배열);
0x080484a1 <main+49>:   lea    0xfffffef8(%ebp),%eax
0x080484a7 <main+55>:   push   %eax
0x080484a8 <main+56>:   call   0x804831c <gets>

- gets()를 이용해 사용자로부터 입력을 받음

- gets()는 문자열을 담을 공간의 길이와 입력받은 문자열의 길이를 확인하지 않고 입력을 받으므로 BOF에 취약

- gets()로 입력을 받을 때, str+dummy+SFP를 덮을 수 있는 충분한 \x90와 쉘코드의 주소를 인자로 전달할 경우 RET 값이 쉘코드를 저장하고있는 주소로 변조되어 쉘코드가 실행됨

- 쉘코드를 환경변수로 선언 및 환경변수의 주소 확인

- NOP를 268개(str(256byte)+dummy(8byte)+SFP(4byte)) + Little-Endian환경변수 주소를 인자로 attackme 실행

- 쉘이 실행되지 않아 구글조회 결과 cat 명령과 | 을 이용해 프로그램을 실행해야함

- Pipe(|) 사용 시 Pipe 기준으로 왼쪽 프로그램의 결과가 오른쪽 프로그램의 입력으로 전달되는데, python이 실행되고 종료되면서 broken pipe 오류로 인해 종료가 발생함

- 따라서 사용자의 입력을 출력해주는 cat이나 te를 이용하여 stdin을 유지 시켜야함

'문제풀이 > FTZ' 카테고리의 다른 글

FTZ Level14 풀이  (0) 2022.11.05
FTZ Level13 풀이  (0) 2022.11.04
FTZ Level11 풀이  (0) 2022.10.31
FTZ Level10 풀이  (0) 2022.10.31
FTZ Level9 풀이  (1) 2022.10.30

+ Recent posts