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了
Comments | NOTHING