콘텐츠로 건너뛰기

Long Sleep

문제 정보

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

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}
태그:

답글 남기기