[逆向学习笔记]桂林电子科技大学“深信服杯”

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; // [rsp+0h] [rbp-10h]
signed int i; // [rsp+4h] [rbp-Ch]
signed int j; // [rsp+8h] [rbp-8h]
int k; // [rsp+Ch] [rbp-4h]

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; // rax
_QWORD *v5; // ST28_8
int str_long; // [rsp+0h] [rbp-30h]
char v7; // [rsp+1Fh] [rbp-11h]

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; // rax

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)+'}'

#flag{1134240024}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×