[GUET-CTF2019]number_game
[GUET-CTF2019]number_game
打开题目,立刻定位关键函数
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;
}
}
}
第一次碰到,甚至还以为是要我去爆破(写出来是28个嵌套for循环,最后还失败了哈哈哈哈)
然后就去搜了wp,发现这是一种数独的判读,类似于迷宫一样,也算是一种题型
特征也很明显,就是判断行和列能不能相等
然后第二个有意思的就是中序遍历的二叉树
_int64 __fastcall sub_400807(__int64 a1, __int64 a2)
{
__int64 result; // rax
result = a1;
if ( a1 )
{
sub_400807(*(a1 + 8), a2);
*(a2 + dword_601080++) = *a1;
return sub_400807(*(a1 + 16), a2);
}
return result;
}
emm,没学过,
动调一下
直接输入0123456789
绕过读入限制之后
得到7381940526
也就是经过加密后的顺序,那么接下来解出数独中的未知数
再按照加密顺序重新排序一下,flag就出来了
附上IDA分析:
以及动调泄露
总结一下,还是对常见算法特征的判断:
二叉树的特征就是两个自身递归加上一个赋值
而数独判断就是行和列相等加上三个for循环嵌套