ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • speedrun-009 - DEFCON 27
    Write-ups/CTFs 2020. 2. 22. 14:52

    Prob Info


    Checksec

    모든 보호기법이 켜져있다. 

    Code


    void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
    {
      setvbuf(stdout, 0LL, 2, 0LL);
      if ( !getenv("DEBUG") )
        alarm(5u);
      banner();
      vuln();
      finish();
      exit(0);
    }

    "DEBUG"라는 환경변수가 있으면 5초 알람을 설정하지 않는다. 시작, 종료 배너를 출력해주고 그 사이에 실제 취약한 함수가 존재한다.

     

    unsigned __int64 vuln()
    {
      char buf; // [rsp+7h] [rbp-4E9h]
      ssize_t v2; // [rsp+8h] [rbp-4E8h]
      char s; // [rsp+10h] [rbp-4E0h]
      char v4; // [rsp+D7h] [rbp-419h]
      char v5; // [rsp+E0h] [rbp-410h]
      unsigned __int64 v6; // [rsp+4E8h] [rbp-8h]
    
      v6 = __readfsqword(0x28u);
      while ( 1 )
      {
        menu();
        v2 = read(0, &buf, 1uLL);
        if ( v2 != 1 )
          break;
        if ( buf == '1' )
        {
          read(0, &v5, 0x5DCuLL);
        }
        else
        {
          if ( buf != '2' )
            return __readfsqword(0x28u) ^ v6;
          read(0, &s, 0xC8uLL);
          v4 = 0;
          if ( strchr(&s, 'n') )
          {
            puts("nope");
          }
          else
          {
            printf("Is that it \"", 'n');
            printf(&s);
            puts("\"?");
          }
        }
      }
      return __readfsqword(0x28u) ^ v6;
    }

    1, 2, 3번 메뉴가 존재하는데, 1번은 v5 부터 0x5dc (1500)만큼 입력받고, 2번은 s에 0xc8바이트를 입력받아 fsb를 일으킨다. 

     

    canary와 s사이의 거리가 꽤 되기 때문에 %p로 찾기가 어려운데, 그냥 v5에다 b를 canary직전까지 채워 넣고 0x6262626262626262 값이 끊기는 시점을 찾으면 된다.

     

    그 뒤 8바이트가 canary이고, 그 뒤가 sfp, 그 뒤가 ret으로 각각 canary, stack, pie를 릭할 수 있고, 더 위로 올라가면 main함수의 ret, 즉 __libc_start_main+240 값을 릭 할 수 있으므로 libc릭까지 가능하다. 이를 이용해 1번 메뉴로 그대로 one_gadget으로 ret을 덮어 쉘을 따면 된다. 

    'Write-ups > CTFs' 카테고리의 다른 글

    feedme - DEFCON 2016  (0) 2020.03.01
    houseoforange - HITCON 2016  (0) 2020.02.27

    댓글

Designed by Tistory.