برنامه نویسی

BabyGame01 PicoCTF 2023 – انجمن DEV

babygame01

100 امتیاز

نویسنده: پالاش اسوال

شرح
پرچم را بگیرید و به خروجی برسید.
به BabyGame خوش آمدید! در اطراف نقشه حرکت کنید و ببینید چه چیزی می توانید پیدا کنید! بازی برای دانلود از اینجا موجود است. هیچ منبعی در دسترس نیست، بنابراین باید مسیر خود را در نقشه پیدا کنید. با استفاده از پورتی که به شما می دهند می توانید با آن ارتباط برقرار کنید.


این چالش توسط من حل نشد، اما تمام اعتبارات به @laundry می‌رسد.

Bla bla بازی برای رسیدن به یک مربع خاص در بازی با استفاده از wasd سرد.

بیایید به خود کد با استفاده از آن نگاه کنیم IDA.

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4; // [esp+1h] [ebp-AA5h]
  int v5[2]; // [esp+2h] [ebp-AA4h] BYREF
  char v6; // [esp+Ah] [ebp-A9Ch]
  char v7[2700]; // [esp+Eh] [ebp-A98h] BYREF
  unsigned int v8; // [esp+A9Ah] [ebp-Ch]
  int *p_argc; // [esp+A9Eh] [ebp-8h]

  p_argc = &argc;
  v8 = __readgsdword(0x14u);
  init_player(v5);
  init_map(v7, v5);
  print_map(v7, v5);
  signal(2, sigint_handler);
  do
  {
    do
    {
      v4 = getchar(p_argc);
      move_player(v5, v4, v7);
      print_map(v7, v5);
    }
    while ( v5[0] != 29 );
  }
  while ( v5[1] != 89 );
  puts("You win!");
  if ( v6 )
  {
    puts("flage");
    win();
    fflush(stdout);
  }
  return 0;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای #برنده شدن باید بسازیم v6 صفر نیست

زیرا به خوبی بالای متغیر قرار گرفته بود v7 من برای چندین سال تلاش کردم تا با استفاده از آن یک سرریز بافر انجام دهم getchar() خود کارکرد، احمق.

قطعه کد مربوطه برای حل این مشکل در move_player تابع.

_BYTE *__cdecl move_player(_DWORD *a1, char a2, int a3)
{
  _BYTE *result; // eax

  if ( a2 == 108 )
    player_tile = getchar();
  if ( a2 == 112 )
    solve_round(a3, a1);
  *(_BYTE *)(a1[1] + a3 + 90 * *a1) = 46;
  switch ( a2 )
  {
    case 'w':
      --*a1;
      break;
    case 's':
      ++*a1;
      break;
    case 'a':
      --a1[1];
      break;
    case 'd':
      ++a1[1];
      break;
  }
  result = (_BYTE *)(a1[1] + a3 + 90 * *a1);
  *result = player_tile;
  return result;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون 2 دستور مخفی به ما نشان داده شده است:

## اکنون زمان حل است

قبل از شروع به یاد داشته باشید که ابتدا تمام حرکت را امتحان کنید wasd به طوری که قبل از اتمام آن در بازی وجود نداشته باشید.

  • w و a با استفاده از این دو ما می توانیم برنده شویم، بازیکن را به سمت آنها حرکت دهیم Player position: 0 0 و سپس با استفاده از a پخش کننده خود را حرکت دهید تا از نقشه a خارج شود تا زمانی که ببینید پرچم از 0 به 46 یا 64 تغییر کرده است.

توضیحات تصویر

اکنون می توانید با استفاده از آن به موقعیت نهایی بروید تا برنده شوید l و سپس p برنده شوید و پرچم خود را به آنجا ببرید.

picoCTF {پرچم شما}

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا