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

+ Recent posts