ida打开进入主函数
先看第一个if里面的函数
首先是判断输入长度是否为10,然后逐个检查输入的字符是否是在0到4之间
然后我们看主函数中第二个if里的函数sub_400917
自己看没看懂…看了看别人的wp才知道这是个数独游戏(第一次接触这种题),这个是个5*5的数独游戏其中行和列都不能有重复的
14#23
30#1#
0#23#
#3##0
42##1
就是这个样子,不考虑中间那些函数,我们应该输入0421421430,输入以后不对,应该是中间的函数做了某些调换或者其他操作
然后,sub_400758,sub_400807里面都是递归函数,看不明白,又看网上的大佬wp发现可以用动调来判断他这个调换的位置,然后自己又重新设置了一遍ida的远程调试…
这里输入0123456789来方便判断他调换的位置
在这个地方下断点
修改z标志位使其可以执行下面的代码(因为输入的字符范围不对嘛)
继续执行到第二个if
双击v7查看v7(就是调换后的顺序)
得到这样一个对照表
又之前输入后转变的是:0421421430
#include <stdio.h>
int main()
{
char arr[] = { 48, 52, 50, 49, 52, 50, 49, 52, 51, 48,0 };
int i,biao[] = { 7,3,8,1,9,4,0,5,2,6 };
char input[11] = { 0 };
for (i = 0; i < 10; i++)
input[biao[i]] = arr[i];
printf("flag{%s}", input);
return 0;
}
得到flag为: flag{1134240024}