[Dreamhack] Long Sleep

chrmqgozj·2025년 2월 12일

DreamHack

목록 보기
28/39
  1. main
__int64 __fastcall main(int a1, char **a2, char **a3)
{
  int i; // [rsp+Ch] [rbp-34h]
  char v5[40]; // [rsp+10h] [rbp-30h] BYREF
  unsigned __int64 v6; // [rsp+38h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  puts("Wait! I'm generating flag!!");
  sub_1411(v5, a2);
  printf("Here's your flag: DH{");
  for ( i = 0; i <= 31; ++i )
    printf("%02x", (unsigned __int8)v5[i]);
  puts("}");
  return 0LL;
}

문제에서 프로그램이 잠을 자서 결과값을 얻을 수 없다고 한다.
결과값을 우리가 구하는게 아니라 잠을 못 자게 프로그램을 수정해야 한다.

  1. sleep
    모든 함수들을 열어보면 sleep을 가진 딱 하나의 함수를 찾을 수 있다.
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;
  rqtp.tv_sec = qword_4038;
  rqtp.tv_nsec = 1LL;
  v0 = sys_nanosleep(&rqtp, &rmtp);
  return v4 - __readfsqword(0x28u);
}

호출: sub_1552 -> sub_14D2
저 sleep만 지우면 되지 않을까

무결성 검사 때문에 수정하면 안 된다.

  1. gdb

엥 gdb로 건드리는 것도 안 된다고...

exit도 그냥 없애버릴까

정답!

0개의 댓글