0x0number_game
跟flag直接相关的就是这个函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| __int64 sub_400917() { unsigned int v1; signed int i; signed int j; int k;
v1 = 1; for ( i = 0; i <= 4; ++i ) { for ( j = 0; j <= 4; ++j ) { for ( k = j + 1; k <= 4; ++k ) { if ( *(&unk_601060 + 5 * i + j) == *(&unk_601060 + 5 * i + k) ) v1 = 0; if ( *(&unk_601060 + 5 * j + i) == *(&unk_601060 + 5 * k + i) ) v1 = 0; } } } return v1; }
|
分析了一下,题目的要求就是补全一个硬编码在内存里的5x5矩阵,它的横竖不能有相同的数字。在根据前面只能输入0~5的数字,手动一下,很容易还原了矩阵。
得到还原出来的字符串,但这是通了前两个函数偏移的出来的矩阵。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| _QWORD *__fastcall sub_400758(__int64 cin, int offset, int a3) { _QWORD *v4; _QWORD *v5; int str_long; char v7;
str_long = a3; v7 = *(offset + cin); if ( v7 == 32 || v7 == 10 || offset >= a3 ) return 0LL; v4 = malloc(0x18uLL); v5 = v4; *v4 = v7; v4[1] = sub_400758(cin, 2 * offset + 1, str_long); v5[2] = sub_400758(cin, 2 * (offset + 1), str_long); return v5; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| __int64 __fastcall sub_400807(__int64 a1, __int64 a2) { __int64 result;
result = a1; if ( a1 ) { sub_400807(*(a1 + 8), a2); *(a2 + dword_601080++) = *a1; result = sub_400807(*(a1 + 16), a2); } return result; }
|
看来出题人很喜欢递归啊!!!这递归看得眼花缭乱。
庆幸的是偏移与输入内容无关。输入0123456789,再patch一下ZF,就能得出原字符串和偏移后的字符串。
整个python脚本跑一跑即可得到flag。
1 2 3 4 5 6 7 8 9 10
| ch = '7381940526' code = '0421421430' flag = ['','','','','','','','','','']
for i in xrange(10): flag[ord(ch[i])-ord('0')]=code[i]
print 'flag{'+''.join(flag)+'}'
|