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 |