ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Welcome - pwnable.xyz
    Write-ups/pwnable.xyz 2019. 10. 11. 19:49

    Prob Info


    Prob Info
    Checksec

    __int64 __fastcall main(__int64 a1, char **a2, char **a3)
    {
      _QWORD *v3; // rbx
      __int64 v4; // rdx
      char *v5; // rbp
      __int64 v6; // rdx
      size_t v7; // rdx
      size_t size; // [rsp+0h] [rbp-28h]
      unsigned __int64 v10; // [rsp+8h] [rbp-20h]
    
      v10 = __readfsqword(0x28u);
      sub_B4E(a1, a2, a3);
      puts("Welcome.");
      v3 = malloc(0x40000uLL);
      *v3 = 1LL;
      _printf_chk(1LL, "Leak: %p\n", v3);
      _printf_chk(1LL, "Length of your message: ", v4);
      size = 0LL;
      _isoc99_scanf("%lu", &size);
      v5 = (char *)malloc(size);
      _printf_chk(1LL, "Enter your message: ", v6);
      read(0, v5, size);
      v7 = size;
      v5[size - 1] = 0;
      write(1, v5, v7);
      if ( !*v3 )
        system("cat /flag");
      return 0LL;
    }

    사용자로부터 입력을 받은 변수 v7를 핸들링 할 수 있으므로 size를 잘 이용해 OOB를 일으키면 될 것 같다. 또한 malloc을 할 때 사용자로부터 입력을 받은 값만큼 할당을 해주는데, 이를 이용해 v5를 핸들링 할 수 있다. 일반적으로 topChunk를 넘어가는 사이즈를 요청하면 커널에 sbrk로 새로운 페이지를 요청하는데, 이 크기도 넘어가는 사이즈를 요청하면 malloc은 0을 반환한다.

     

    v5[size - 1] = 0; 

    다시말해 위 코드는 우리가 핸들링 할 수 있는 두 값을 모두 사용하므로 메모리에 직접 접근할 수 있다. size에 큰 값을 넣으면 v5 = 0이 되어 v5[size-1]은 결국 size - 1의 주소를 의미하게 된다. 이를 릭해준 v3 + 1의 주소로 지정하면 v3의 값을 0으로 바꿀 수 있다.

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

    note - pwnable.xyz  (0) 2020.02.11
    GrownUp - pwnable.xyz  (0) 2020.02.11
    misalignment - pwnable.xyz  (0) 2020.02.11
    add - pwnable.xyz  (0) 2020.02.11
    sub - pwnable.xyz  (0) 2019.10.21

    댓글

Designed by Tistory.