1. 풀이
- hint 파일의 내용을 보면, 256byte의 str배열을 선언한 후, setreuid()로 level12의 권한을 부여한 후 문자열 복사 및 출력을 수행
- strcpy()에는 다음과 같은 취약점이 존재함
- 즉, str 배열은 256byte의 크기를 지니고 있음에도 불구하고, strcpy()는 문자열의 길이를 검사하지 않고 NULL 문자를 만나기 전까지의 문자열을 복사하므로, BOF(버퍼 오버플로우)에 취약한 함수
- attackme 파일을 tmp로 복사한 후 gdb로 attackme 파일을 분석해보면 다음과 같음
① Procedure Prelude
0x08048473 <main+3>: sub $0x108,%esp
- 지역변수에 0x108(264) 만큼의 공간을 할당
- str 배열의 크기는 256byte이므로 8byte 만큼의 dummy가 존재하는 것을 알 수 있음
② setreuid(0xc14,0xc14)
0x0804847c <main+12>: push $0xc14
0x08048481 <main+17>: push $0xc14
0x08048486 <main+22>: call 0x804834c <setreuid>
- level12의 권한 부여
③ strcpy(복사할 대상, 복사할 원본);
0x08048497 <main+39>: pushl (%eax)
0x08048499 <main+41>: lea 0xfffffef8(%ebp),%eax
0x0804849f <main+47>: push %eax
0x080484a0 <main+48>: call 0x804835c <strcpy>
- strcpy()를 이용해 argv[1]의 값을 str 배열에 복사를 수행
- strcpy()는 문자열 길이에 대한 검증을 수행하지 않기에 BOF에 취약
- 즉, argv[1]에 쉘코드를 전달하면 strcpy()의 취약점으로 인해 쉘코드까지 복사되어 쉘코드가 수행됨
- 따라서, RET에 str 배열의 시작 주소를 전달하면, 쉘코드를 수행할 수 있음
④ printf(str)
0x080484b1 <main+65>: push %eax
0x080484b2 <main+66>: call 0x804833c <printf>
- str 출력
- str의 시작 주소를 알기위해 strcpy() 수행 후인 <main+53>에 BP(브레이크 포인트)를 설정한 후 인자를 전달
- 하지만 ASLR이 적용되어 있어 매번 주소값이 변경됨
ASLR (Address Space Layout Randomization)
- 주소의 공간을 무작위로 변경하는 기법
- 데이터, 스택, 힙 영역의 주소를 무작위로 변경하는 기법
- 따라서 환경변수의 주소 값을 매 실행마다 다르게 하여 원하는 값이나 주소를 가져오지 못하도록 만드는 기술
- 해당 기법을 우회 하기위해 RET에 쉘코드가 저장된 환경변수의 주소를 전달하면, 쉘 코드를 수행할 수 있게됨
- 먼저 공격에 사용할 쉘코드가 저장된 환경변수를 선언
- 해당 쉘코드는 가장 기본적으로 쉘을 띄우는 25byte의 쉘코드
\x90
- NOP(No OPeration)
- 프로그램의 실행에 영향을 주지 않는 명령어
- 프로그램이 실행 중에 NOP 명령어를 만나면 아무런 동작없이 다음 명령어로 넘어가게됨
- 쉘코드의 시작주소를 정확히 알지 못하더라도 NOP를 통해 쉘코드를 실행시킬 수 있으며, 이를 NOP SLED 기법이라함
- 다음으로, 해당 코드를 사용해 환경변수의 주소를 확인
- NOP를 268개(str(256byte)+dummy(8byte)+SFP(4byte)) + Little-Endian환경변수 주소를 인자로 attackme 실행
'문제풀이 > FTZ' 카테고리의 다른 글
FTZ Level13 풀이 (0) | 2022.11.04 |
---|---|
FTZ Level12 풀이 (0) | 2022.10.31 |
FTZ Level10 풀이 (0) | 2022.10.31 |
FTZ Level9 풀이 (1) | 2022.10.30 |
FTZ Level8 풀이 (0) | 2022.10.30 |