首页
社区
课程
招聘
[原创]第六题 Repwn
2019-3-25 15:06 3378

[原创]第六题 Repwn

2019-3-25 15:06
3378

第六题

这个题是我蒙混过关的,本来有两关,但是做了一关就被放行了= =
函数总体为:

int sub_4014C0()
{
  unsigned int v0; // ebx
  sub_4044B0();
  v0 = 0;
  v3 = 0x7F79745E;
  v4 = 0x2B704C63;
  v5 = 1630229319;
  v6 = 1194152263;
  v7 = 1198270550;
  v8 = 695827786;
  v9 = 1397178665;
  v10 = 6644011;
  strcpy(Str, "Ansome_Is_Wrong");
  while ( v0 < strlen((const char *)&v3) )
    *((_BYTE *)&v3 + v0++) ^= 0x18u;
  puts("Please Input Your Key_ Now!");
  scanf("%s", &v11);
  if ( sub_4012F0((int)&v11) )
  {
    sub_401460(&v11);
    system("pause");
  }
  else
  {
    puts(Str);
  }
  return 0;
}

跟进,得知第9位到第20为是X1Y0uN3tG00d,

signed int __cdecl sub_4012F0(int a1)
{
  while ( *((_BYTE *)&v4 + v2) == *(_BYTE *)(v1 + a1) )
  {
    ++v2;
    ++v1;
    if ( v2 > 11 )
    {
      result = 1;
      if ( *(_BYTE *)(a1 + 20) == 0x48 )
        return result;
      return 0;
    }
  }
  return 0;
}

继续往下跟

signed int __cdecl sub_4013B0(int a1)
{
  int v1; // ebx
  int v2; // ecx
  int v3; // esi
  signed int result; // eax

  sub_401380(a1);
  v1 = dword_40802C + 1000 * dword_408020 + 100 * dword_408024 + 10 * dword_408028;
  v2 = dword_408034 + 10 * dword_408030;
  v3 = dword_40803C + 10 * dword_408038;
  if ( 2 * (v1 + v2) != 4040 || 3 * v2 / 2 + 100 * v3 != 115 )
    goto LABEL_2;
  result = 1;
  if ( v1 - 110 * v3 != 1900 )
  {
    printf("Key_Is_Wrong,Please_Input_Again!");
LABEL_2:
    result = 0;
  }
  return result;
}

得知前八位可以为20101001,这其实有很多个解满足,所以这也是这道题争论非常狂躁的原因,而我刚好捡个漏。= =
最后四位是一个栈溢出,只要溢出到0x401BF0即可,得出最后四位为HaCk,所以第一步的flag为20101001X1Y0uN3tG00dHaCk。


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回