hackme(逆向)bitx

发布于 2018-03-14  806 次阅读


main函数代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax@2

  if ( argc > 1 )
  {
    if ( verify(argv[1]) )
      puts("Good");
    else
      puts("Not flag");
    result = 0;
  }
  else
  {
    printf("Usage: %s FLAG{This is not flag}\n", *argv);
    result = 0;
  }
  return result;
}

主要在if( verify(argv[1])

verify函数代码

signed int __cdecl verify(int a1)
{
  int i; // [sp+Ch] [bp-4h]@1

  for ( i = 0; *(i + a1) && *(i + 0x804A040); ++i )
  {
    if ( *(i + a1) + 9 != (((*(i + 0x804A040) & 0xAA) >> 1) | (2 * (*(i + 0x804A040) & 0x55))) )
      return 0;
  }
  return 1;
}

看verify函数可以知道是在和0x804A040位置上的数据进行对比

0x804a040位置上的数据

0804A040  8F AA 85 A0 48 AC 40 95  B6 16 BE 40 B4 16 97 B1  ....H.@....@....
0804A050  BE BC 16 B1 BC 16 9D 95  BC 41 16 36 42 95 95 16  .........A.6B...
0804A060  40 B1 BE B2 16 36 42 3D  3D 49 00 ?? 00 00 00 00  @....6B==I.?....

py代码

data=[0x8f, 0xaa, 0x85, 0xa0, 0x48, 0xac, 0x40, 0x95, 0xb6, 0x16, 0xbe, 0x40, 0xb4, 0x16, 0x97, 0xb1, 0xbe, 0xbc, 0x16, 0xb1, 0xbc, 0x16, 0x9d, 0x95, 0xbc, 0x41, 0x16, 0x36, 0x42, 0x95, 0x95, 0x16, 0x40, 0xb1, 0xbe, 0xb2, 0x16, 0x36, 0x42, 0x3d, 0x3d, 0x49, 0x00]
ans = ""
for i in xrange(42):
    ans += chr((((data[i] & 0xaa) >> 1) | (2 * (data[i] & 0x55))) - 9)
print ans

跑一下就可以出来flag了