ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • J-U-M-P - pwnable.xyz
    Write-ups/pwnable.xyz 2020. 2. 13. 19:56

    Prob Info


    Prob Info
    Checksec

    int __cdecl main(int argc, const char **argv, const char **envp)
    {
      unsigned __int8 v3; // [rsp+2Fh] [rbp-11h]
      __int64 v4; // [rsp+30h] [rbp-10h]
      void *v5; // [rsp+38h] [rbp-8h]
    
      setup();
      v4 = gen_canary();
      puts("Jump jump\nThe Mac Dad will make you jump jump\nDaddy Mac will make you jump jump\nThe Daddy makes you J-U-M-P\n");
      v5 = &loc_BA0;
      while ( 1 )
      {
        print_menu();
        printf("> ", argv);
        v3 = read_int8();
        switch ( v3 )
        {
          case 2u:
            v5 = (void *)(signed int)((unsigned int)v5 ^ v3);
            break;
          case 3u:
            argv = (const char **)environ;
            printf("%p\n", environ);
            break;
          case 1u:
            if ( v4 == canary )
              JUMPOUT(__CS__, v5);
            break;
          default:
            puts("Invalid");
            break;
        }
      }
    }

    이 문제는 특이하게 카나리를 직접 생성하고 main함수 내에서만 사용한다. 아래 read_int8 함수에는 카나리를 사용하지 않아 1byte bof가 일어난다. 

    int read_int8()
    {
      char buf; // [rsp+0h] [rbp-20h]
    
      read(0, &buf, 0x21uLL);
      return atoi(&buf);
    }

    이 경우 sfp를 덮어 main함수의 rbp를 수정할 수 있다. 3번 메뉴에서 environ을 leak해주기 때문에 적절히 변수들을 변경할 수 있다. 

    v3를 v5로 인식하게 하기 위해 rbp를 9만큼 더해 올려주고 win함수의 하위 1바이트로 덮어주면 함수가 변경된다. 

    1번 메뉴를 사용하기에는 카나리의 위치도 변경되었기에 다시 원래 rbp의 값으로 변경해준 후 1번 메뉴를 이용해 플래그를 얻을 수 있다.

    'Write-ups > pwnable.xyz' 카테고리의 다른 글

    UAF - pwnable.xyz  (0) 2020.02.13
    iape - pwnable.xyz  (0) 2020.02.13
    SUS - pwnable.xyz  (0) 2020.02.13
    fspoo - pwnable.xyz  (0) 2020.02.13
    Game - pwnable.xyz  (0) 2020.02.12

    댓글

Designed by Tistory.