CTF题解二 逆向 大杂烩(ISCC2017)

将CrackMe.exe拖进IDA进行分析

1.首先看main函数:

这里写图片描述
sub_401210()的返回值应该为1,所以!sub_401210()为0,进入else。

2.观察sub_401210函数:

这里写图片描述

可以看到需要满足5个if,才能使得返回值为1。

  • 第一个if:

可以看出v1的长度为25,v1[4]为 ‘{‘,v1[8]、v1[10]、v1[15]为’_’,v1[24]为’}’

v1应该就是flag了,那么其前四位应该就是’flag’这四个字母。

到目前为止,v1为:flag{XXX_X_XXXX_XXXXXXXX}

通过百度可以查到,wcstok是用来对wchar_t类型的数进行分割的。wcstok(v1, L"{_}")这句话就是表示对v1在’{‘、’_’、’}’这几个字符处进行分割。

第一次分割,碎片’flag’被遗弃。第二次分割,v4等于XXX。

  • 第二个if:

把6815860转换为16进制得到0x680074,0x74对应t,0x68对应h。所以这里说明v4等于thX

另外v4[4]表示X为’4’

v5是X,v6是将v5转换成了int型。

  • 第三个if:

说明v6等于4,

X为’4’。

v7等于XXXX。

  • 第四个if:

sub_401000(v7)的返回值需要为1。

v8等于XXXXXXXX。

  • 第五个if:

sub_401800(v8)的返回值需要为1。

3.观察sub_401000()函数:

这里写图片描述

如果要返回值为1,则v6不能等于0

如果v4和”62cc0b4ebb0b57b40778179234246c38”相等,则v6等于1。

62cc0b4ebb0b57b40778179234246c38为MD5加密后的结果,解密得your。

your应该就是flag中的XXXX了。

4.观察sub_401180()函数:

这里写图片描述

v1为输入,v2为v1转化为多字节之后得到的结果。

v2的每一位异或0x66等于20 3 1 15 21 18 3 20

得到v2的每一位为:114 101 103 105 115 116 101 114

所以最后八位为register

异或代码为:

int a[9] = { 20,3,1,15,21,18,3,20 };
int count = 0;
int k = 0;
while (k < 8) {
    for (int i = 0; i < 128; i++) {
        int c = i ^ 0x66;
        if (c == a[count]) {
            printf("%c", i);
            count++;
            break;
        }
    }
    k++;
}
5.得到flag:

flag为:

flag{thx_4_your_register}

其中’x’是猜的
解决了~( ̄▽ ̄~)~

猜你喜欢

转载自blog.csdn.net/ljfyyj/article/details/81002821