0x0
看分數是600分, 實際就是100的題目了。直接看題的
0x1
name = (const char *)malloc(0xC8u);
flag = (const char *)malloc(0x64u);
printf("Enter teamname: ");
fflush(stdout);
__isoc99_scanf("%200s", name);
printf("Enter flag: ");
fflush(stdout);
__isoc99_scanf("%100s", flag);
sleep(2u);
sub_80486AD(name, flag);
free((void *)name);
free((void *)flag);
return 0;
}
signed int __cdecl sub_80486AD(const char *name, const char *flag)
{
signed int result; // eax@2
int v3; // edx@7
FILE *stream; // [sp+24h] [bp-74h]@1
char s; // [sp+28h] [bp-70h]@3
int v6; // [sp+8Ch] [bp-Ch]@1
v6 = *MK_FP(__GS__, 20);
stream = fopen("flag.txt", "r");
if ( stream )
{
fgets(&s, 100, stream);
printf(name); // ohno
if ( !strcmp(&s, flag) )
puts(" : correct flag!");
else
puts(" : incorrect flag. Try again.");
fclose(stream);
result = 0;
}
else
{
result = 1;
}
v3 = *MK_FP(__GS__, 20) ^ v6;
return result;
}
一個很簡單的格式化字符串漏洞。本地建個flag.txt, gdb在printf下斷, 然後看一下stack, 發現flag就在棧了,在第10個偏移。直接%x *40 就ok了, 另外可以用 %p , 效果更好。