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 {پرچم شما}