문제 정보
드멍이는 얼른 프로그램의 결과값을 받고 자러가고 싶어요!
그런데 나쁜 프로그램이 드멍이가 자야할 잠을 대신 자고 있어요…
드멍이가 잘 수 있게 프로그램의 결과 값을 받아주세요!
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}