首届四川省安恒杯CTF逆向WP

0x01 gostright

题目地址:https://jev0n.lanzous.com/ioijle9jcti

0.0 大致思路

开屏暴击,说我缺少一个DLL文件。

00.jpg
我先是没去管它直接拖到IDA里面去看一下,习惯性shift+f12看一下字符串,发现了换表的Base64。

01.jpg
用CyberChef操作了一下,感觉应该是对付反调试的。

02.jpg
然后往下一点就发现了一个'congratulation!'的字符串按X交叉引用过去,F5大法,看起来像是个迷宫之类的题目,这个时候的关键就是要找到这个迷宫。

03.jpg
接着对函数交叉引用看看是谁调用了这个checkflag,在交叉引用过程中发现出现了sp错误,这个时候就要去修复一下位置为0x402EB4

04.jpg
在Options->General处打开Stack pointer,然后发现这里有为负值,用Alt+K修复一下,然后就可以F5了

05.jpg
初步判断这个就是对迷宫进行构造的地方,最主要的就是那个两层循环

06.jpg
然后就是构造迷宫

maze.jpg
最后结合起初发现的那个包含成功提示字符串的函数,进行走迷宫,flag的body一共24个字符,每两个为一组,第一个是方向,第二个是走多少步(用大写字母顺序来判断如:B为走2步)

0.1 迷宫代码

#include<iostream>
using namespace std;

int main()
{
    int array[] = {42,43,40,41,46,47,44,45,34,35,32,33,38,39,36,37,58,59,56,
                    43,40,41,46,47,44,45,34,35,32,33,38,39,36,37,58,59,97,57,
                    40,41,46,47,44,45,34,35,32,33,38,39,36,37,58,59,56,56,62,
                    41,47,46,45,44,35,34,33,32,39,38,37,36,59,58,57,56,63,63,
                    46,46,44,45,34,35,32,33,38,39,36,37,58,59,56,57,62,63,60,
                    47,45,44,35,34,33,32,39,38,37,36,59,58,57,56,63,62,61,61,
                    44,45,34,35,32,33,38,39,36,37,58,59,56,57,62,63,60,60,50,
                    45,35,34,33,32,39,38,37,36,59,58,57,56,63,62,61,61,51,51,
                    34,34,32,33,38,39,36,37,58,59,56,57,62,63,60,60,50,50,48,
                    35,33,33,39,38,37,36,59,58,57,56,63,62,112,61,51,51,49,49,
                    32,32,38,38,36,37,58,59,56,57,62,63,60,61,50,50,48,48,54,
                    33,39,39,37,36,59,58,57,56,63,62,61,60,51,50,49,49,55,55,
                    38,38,36,37,58,59,56,57,62,63,60,61,50,51,48,49,54,54,52,
                    39,37,36,59,58,57,56,63,62,61,60,51,50,49,48,55,54,53,53,
                    36,37,58,59,56,57,62,63,60,61,50,51,48,49,54,55,52,53,10};
    int i = 0;
    for (i = 0; i < 285; ++i)
    {
        int k = i / 19 + i % 19;
        if (i % 19 == 0 && i != 0)
        {
            cout << endl;
        }
                cout << (char)(array[i] ^ k);
    }

    getchar();
    return 0;
}

0.2 总结

题目逻辑上手之后感觉还可以,起初自己比较懒加上太久没做题,总想着找空子找捷径结果就是没在规定时间内写完有点亏,然后还有就是因为我机子上缺个DLL所以也就没进行动态调试,我看网上的方法也不得行,不懂为什么。