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 |