1. 풀이

- hint 파일을 살펴보면, level14와 유사하지만 level14와 달리 check 변수가 포인터 변수로 설정되어 있음

- 포인터 변수는 메모리 주소의 값을 저장하는 변수로, check 변수 주소의 값이 0xdeadbeef일 경우 level16의 권한과 쉘을 획득할 수 있음

- attackme 파일을 파일을 /tmp로 복사 후 gdb로 분석

 

 Procedure Prelude

0x08048490 <main+0>:    push   %ebp
0x08048491 <main+1>:    mov    %esp,%ebp
0x08048493 <main+3>:    sub    $0x38,%esp

- 지역변수에 56byte(0x38) 할당

 

② fgets(배열, 문자 길이, STDIN)
0x08048499 <main+9>:    pushl  0x8049664 // STDIN
0x0804849f <main+15>:   push   $0x2d // 문자길이 (0x2d = 45)
0x080484a1 <main+17>:   lea    0xffffffc8(%ebp),%eax // 0xffffffc8 (buf의 주소)
0x080484a4 <main+20>:   push   %eax // buf 주소
0x080484a5 <main+21>:   call   0x8048360 <fgets>
- 즉, fgets()를 통해 0xffffffc8 (buf의 주소)에 사용자 입력값을 받음

- <main+29>를 통해 *check 변수는 0xfffffff0에 위치하며, buf와 *check 사이에는 20byte 만큼의 dummy가 존재

- 또한, 전체 지역변수 공간 56byte 중 buf(20)+dummy(20)+*check(4)를 제외한 12byte 만큼의 공간이 crap(4)+dummy(8)에 할당됨을 알 수 있음

 

③ if(*check==0xdeadbeef)

0x080484b0 <main+32>:   cmpl   $0xdeadbeef,(%eax)

- check 포인터가 가리키는 메모리 주소의 값이 0xdeadbeef 인지 검증

 

④ if(*check==0xdeadbeef) True

0x080484bb <main+43>:   push   $0xc18
0x080484c0 <main+48>:   push   $0xc18
0x080484c5 <main+53>:   call   0x8048380 <setreuid>
0x080484ca <main+58>:   add    $0x10,%esp
0x080484cd <main+61>:   sub    $0xc,%esp
0x080484d0 <main+64>:   push   $0x8048548
0x080484d5 <main+69>:   call   0x8048340 <system>

- level16 권한 부여 후 /bin/sh 실행

 

공격방법 1. 환경변수

- CODE 환경변수로 0xdeadbeef를 선언

- check의 값으로 환경변수의 주소를 전달 하였으나 쉘을 얻지못함

- 구글 조회 결과 환경변수의 주소값은 디렉토리의 경로나 프로그램의 변수 개수 등에 의해 주소값이 밀려서 달라지게 되는것을 알 수 있었음

- 밀린 바이트 수까지 반영하여 보다 정확한 환경변수 주소를 구하는 코드는 다음과 같음

- 환경변수의 주소를 구해 attackme 실행 시 level16의 비밀번호를 알 수 있음

 

공격방법 2. 0xdeadbeef 주소 값 전달

- 0xdeadbeef를 비교하는 main+32에 bp 설정 및 프로그램 실행 후 $eip(다음 명령을 저장) 확인

- main+32에서 dead와 beef를 확인할 수 있으며, 0x80484b0부터 1씩 증겨시키면서 0xdeadbeef의 위치를 확인하면 0x80484b2에 해당 값이 저장되어 있음을 알 수 있음

 

공격방법 3. buf 이용

- buf에 0xdeadbeef를 저장한 후 check에 buf의 주소값을 전달하면 결과적으로 check는 0xdeadbeef 값을 가리키게됨

- 해당 방법을 이용하기 위해서는 buf의 시작 주소를 알아야 함

- 0xdeadbeef를 비교하는 main+32에 bp 설정 및 프로그램 실행 후 $esp 확인 결과 buf의 시작주소는 0xbffff7d0인 것을 알 수 있음

- fgets() 함수 실행 및 main으로 복귀 후 bp에 의해 실행을 멈추게 되어 현재 esp는 buf의 위치를 가짐

- 하지만 ASLR 기법으로 인해 주소가 달라져 성공률이 낮음

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

FTZ Level17 풀이  (0) 2022.11.07
FTZ Level16 풀이  (0) 2022.11.05
FTZ Level14 풀이  (0) 2022.11.05
FTZ Level13 풀이  (0) 2022.11.04
FTZ Level12 풀이  (0) 2022.10.31

+ Recent posts