1. 풀이

- hint 파일의 내용을 통해 fgets()로 buf 배열에 45byte 만큼의 입력을 받으며, check의 값이 0xdeadbeef와 같아야 한다는 것을 알 수 있음

 

 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의 주소)에 사용자 입력값을 받음

 

③ if (check==0xdeadbeef)

0x080484ad <main+29>:   cmpl   $0xdeadbeef,0xfffffff0(%ebp) // 0xfffffff0 (check 주소)

- 0xfffffff0의 값, 즉 check 변수의 값이 $0xdeadbeef와 동일한지 검증

- ②와 ③을 통해 buf 배열과 check 변수 사이에 20byte 만큼의 dummy가 있음을 알 수 있음

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

 

④ if() True일 경우

0x080484b9 <main+41>:   push   $0xc17
0x080484be <main+46>:   push   $0xc17
0x080484c3 <main+51>:   call   0x8048380 <setreuid>
0x080484c8 <main+56>:   add    $0x10,%esp
0x080484cb <main+59>:   sub    $0xc,%esp
0x080484ce <main+62>:   push   $0x8048548
0x080484d3 <main+67>:   call   0x8048340 <system>

- level15의 권한 부여 및 /bin/sh 실행

 

- 공격 방법은 다음과 같음

① buf+dummy 만큼 버퍼오플로우

② check 변수에 $0xdeadbeef 값 전달

③ level15의 쉘 휙득

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

FTZ Level16 풀이  (0) 2022.11.05
FTZ Level15 풀이  (0) 2022.11.05
FTZ Level13 풀이  (0) 2022.11.04
FTZ Level12 풀이  (0) 2022.10.31
FTZ Level11 풀이  (0) 2022.10.31

+ Recent posts