[GUET-CTF2019]number_game

这道题emm,又让我不停的踩以前的一个坑,题目是一种提示的坑,老忘记。

首先,打开ida反编译

 

 进入函数sub_400917先看看,然后发现这是个数独(一开始我没发现......看到第二个对比的时候懵了,然后看了下别人的博客,发现是数独)

 

 接着进入sub_400881函数,是一个赋值函数

 

 接下来就是sub_400758和sub_400807函数了,这个时候就先分析前面那个函数

这里的v5=v4是让v5和v4的地址相等,而*v4=v7,是让v4指向的地址值为v7,所以这里是赋值v4[0],下面两个是赋v4[1]和v4[2]的,由于有多次赋值,最后怎么赋值的我也不清楚。。。(推荐这里用动态调试。。可惜我是Windows,我linux上也没装ida,但我猜测就是换位置,所以我跑去别那看了看)

 

 接着看后面这个函数, 又是递归,很明显的是赋值语句在第9行,而这个加8和加16指的是指针数组,可以到外面看看这个传进来的参数a1,所以这个也是赋值

 

然后我看了一位师傅的博客:https://blog.csdn.net/Palmer9/article/details/104613420这是那位师傅自己手动弄出来的交换后的结果,简单明了

 

 然后在回到先前的数独

 

 答案是0,4,2,1,4,2,1,4,3,0

写脚本

#include<stdio.h>
#include<iostream>
int main()
{
    char s1[255] = { '0','4','2','1','4','2','1','4','3','0' };
    int sort[255] =  { 7,3,8,1,9,4,0,5,2,6 };

    char f[255];
    for (int i = 0; i < 10; i++)
    {
        f[sort[i]] = s1[i];
    }
    f[10] = '\0';
    ::std::cout << f;
}

 

posted @ 2020-05-13 20:59  PYozo_free  阅读(862)  评论(0编辑  收藏  举报