ABOUT ME

-

  • GrownUp - pwnable.xyz
    Write-ups/pwnable.xyz 2020. 2. 11. 23:13

    Prob Info


    Prob Info
    Checksec

     

    int __cdecl main(int argc, const char **argv, const char **envp)
    {
      char *src; // ST08_8
      __int64 buf; // [rsp+10h] [rbp-20h]
      __int64 v6; // [rsp+18h] [rbp-18h]
      unsigned __int64 v7; // [rsp+28h] [rbp-8h]
    
      v7 = __readfsqword(0x28u);
      setup();
      buf = 0LL;
      v6 = 0LL;
      printf("Are you 18 years or older? [y/N]: ", argv);
      *((_BYTE *)&buf + (signed int)((unsigned __int64)read(0, &buf, 0x10uLL) - 1)) = 0;
      if ( (_BYTE)buf != 'y' && (_BYTE)buf != 'Y' )
        return 0;
      src = (char *)malloc(0x84uLL);
      printf("Name: ", &buf);
      read(0, src, 0x80uLL);
      strcpy(usr, src);
      printf("Welcome ", src);
      printf(qword_601160, usr);
      return 0;
    }

    맨 마지막 printf가 조금 이상한데 0x601160를 찾아 들어가보면 setup 함수에서 0x601168이란 값으로 초기화 해주고 0x601168에는 "%s\n"를 저장한다. 결국 printf("%s\n", usr) 와 같은 의미이다.

     

      src = (char *)malloc(0x84uLL);
      printf("Name: ", &buf);
      read(0, src, 0x80uLL);
      strcpy(usr, src);

    이 부분을 잘 보면 힙 영역에 0x80 만큼 값을 입력받고 그 값을 다시 전역변수 usr에 strcpy를 통해 복사한다. 이 때 strcpy는 문자열을 다루는 함수이기 때문에 처리 후 맨 끝에 널바이트를 붙여준다. usr의 사이즈는 0x80이고 그 뒤에 qword_601160 변수가 존재하는데, strcpy 함수로 인해 최대 0x81 바이트를 복사할 수 있고 off-by-one이 발생한다. 이를 통해 qword_601160의 값이 0x601168에서 0x601100으로 바뀌게 되고 이는 usr의 중간부분이므로 fsb가 가능하다.

     

    .data:0000000000601080                 public flag
    .data:0000000000601080 flag            db 'FLAG{_the_real_flag_will_be_here_}',0
    .data:0000000000601080 _data           ends

    바이너리 내부에 플래그가 있으므로 fsb를 통해 이 문자열을 출력해주면 된다.

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

    xor - pwnable.xyz  (0) 2020.02.11
    note - 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.