문제 정보

    드멍이는 얼른 프로그램의 결과값을 받고 자러가고 싶어요!
    그런데 나쁜 프로그램이 드멍이가 자야할 잠을 대신 자고 있어요…
    드멍이가 잘 수 있게 프로그램의 결과 값을 받아주세요!

    Long Sleep/
    └── prob
    
    ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=57ed74dc1248db23d49684b252cf3a415b4c6467, for GNU/Linux 3.2.0, stripped

    unsigned __int64 sub_14D2()
    {
      signed __int64 v0; // rax
      struct timespec rqtp; // [rsp+10h] [rbp-30h] BYREF
      struct timespec rmtp; // [rsp+20h] [rbp-20h] BYREF
      unsigned __int64 v4; // [rsp+38h] [rbp-8h]
    
      v4 = __readfsqword(0x28u);
      ++qword_4038;
      qword_4038 *= 2LL;
      v0 = sys_nanosleep(&rqtp, &rmtp);
      return v4 - __readfsqword(0x28u);
    }

    gdb로 확인해보면 sys_nanosleep에서 멈추는걸 확인할 수 있다.
    해당 sys_nanosleep을 NOP으로 패치시키고,

    __int64 sub_1229()
    {
      __int64 result; // rax
      char v1[112]; // [rsp+10h] [rbp-C0h] BYREF
      __int64 s1[4]; // [rsp+80h] [rbp-50h] BYREF
      char s2[40]; // [rsp+A0h] [rbp-30h] BYREF
      unsigned __int64 v4; // [rsp+C8h] [rbp-8h]
    
      v4 = __readfsqword(0x28u);
      s1[0] = 0x163B95FEE212577FLL;
      s1[1] = 0xC721F82D7AF2BE40LL;
      s1[2] = 0xC604F9A6ED498469LL;
      s1[3] = 0x9E86AA491AEF0275LL;
      sub_19F5((__int64)v1);
      sub_1A73((__int64)v1, (__int64)main, 0x1000uLL);
      sub_1B14((__int64)v1, (__int64)s2);
      LODWORD(result) = memcmp(s1, s2, 0x20uLL) == 0;
      if ( !(_DWORD)result )
      {
        fwrite("*** assertin failed *** integrity_check(): file has been corrupted.", 1uLL, 0x43uLL, stderr);
        exit(-1);
      }
      ++qword_4030;
      return (unsigned int)result;
    }

    무결성을 검사해서 exit로 프로그램을 종료하는 구문이 보이는데
    이거 역시 jnz를 jmp로 패치시키면 되었다.

    ubuntu@WSL2:~/CTF/dreamhack.io/Long Sleep$ ./prob
    Wait! I'm generating flag!!
    Here's your flag: DH{406b2742ffb2a6cac02abb8f303fa12067f8061339979855108ce4a2e38ef558}

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다