ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • rwsr - pwnable.xyz
    Write-ups/pwnable.xyz 2020. 2. 15. 19:13

    Prob Info


    Prob Info
    Checksec

    Code


    int __cdecl main(int argc, const char **argv, const char **envp)
    {
      const char *v3; // rdi
      int v4; // eax
      char *s; // ST10_8
    
      setup();
      v3 = "Read Write Sleep Repeat.";
      puts("Read Write Sleep Repeat.");
      do
      {
        while ( 1 )
        {
          while ( 1 )
          {
            print_menu(v3);
            v4 = read_ulong();
            if ( v4 != 1 )
              break;
            printf("Addr: ", argv);
            v3 = (const char *)read_ulong();
            puts(v3);
          }
          if ( v4 != 2 )
            break;
          printf("Addr: ", argv);
          s = (char *)read_ulong();
          v3 = "Value: ";
          printf("Value: ");
          *(_QWORD *)s = read_ulong();
        }
      }
      while ( v4 );
      return 0;
    }

    제목의 뜻이 read write sleep repeat이였다. 원하는 주소에 값을 읽고, 쓸 수 있다. PIE가 걸려있지 않아 bss영역을 바로 건들어보았다.

     

    bss에 stdin, stdout이 그대로 박혀있었다. 이를 통해 일단 libc leak을 할 수 있다. 그런데 Full RELRO이기 때문에 GOT를 덮을 수는 없다. 

     

    여기까지 삽질하다가 exit함수의 free를 이용해 익스하는 방법을 찾아 진행했다. exit 함수 내부적으로 initial을 하나씩 free하는데, free_hook을 덮고 initial->idx을 0에서 1로 변경해주면 메인함수가 끝나고 exit을 실행하면서 free를 하게되어 free_hook으로 뛰게된다. 

     

    이 방법 말고도 libc의 environ 변수를 읽어서 스택 주소를 릭하는 방법도 있다. 

     

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

    fclose - pwnable.xyz  (0) 2020.02.15
    message - pwnable.xyz  (0) 2020.02.15
    UAF - pwnable.xyz  (0) 2020.02.13
    iape - pwnable.xyz  (0) 2020.02.13
    J-U-M-P - pwnable.xyz  (0) 2020.02.13

    댓글

Designed by Tistory.