back_door__ctf2015 team

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 , 效果更好。

你可能感兴趣的:(exp)