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 |