2017 SWPU cm50和cm100 解题wp

| categories writeups  | tags CTF 

cm50

题目下载链接: cm50.zip

.net程序用dnspy打开,其实就是一个拨打电话的程序。输入电话号码,然后点击“拨打”键就可以打电话。

用dnspy打开后,关键逻辑在于“拨打”的点击事件里。

click

首先验证电话号码长度是否为5, 然后再将电话号码逐位跟4异或并与contrast数组比较。由于异或的传递性,我们可以直接拿contrast跟4异或就好了。这里可以得到08067

之后的flag跟输入的电话号码没有关系,而是直接xor1和xor2和4异或得到,结果是greet_08067

xor1 = [86,65,83,85,76,111,6,15,6,0,1]
xor2 = [53,55,50,52,60,52,50,51,50,50,50]
contrast = [52,60,52,50,51]
phoneNum = ""
flag = ""
for i in range(0,5):
    contrast[i] ^= 4
    phoneNum += chr(contrast[i])
print phoneNum

for j in range(0,11):
    flag += chr(xor1[j] ^ xor2[j] ^ 4)

print flag

# 08067
# greet_08067

cm100

题目下载链接: CM100.zip

界面没有按钮,也没有什么字符串。尝试输入一些长度,发现输入了16个字符后会显示“try again”的信息 但是用IDA打开查找字符串的时候并没有这个字符串。因此可能程序有做信息隐藏。

我们用OD打开,对GetWindowText下断运行。

1 我们按下Ctrl+F9返回到用户模块

2

发现上面就是GetWindowText的api函数,我们继续向下运行,在call 0041074A处,观察eax的结果,发现存储的是我们输入字符串的地址,那么在IDA中,我们就可以将这块函数(004187F2)标记为getInputStr。

我们继续return,看看getInputStr返回到哪里

3

显然,回到了004026A6的位置。在IDA里搜索这附近的函数,只有sub_402600。

4

用IDA分析MFC程序就是很乱。所以我们最好是用OD动态调,观察寄存器相关数据。

我们用OD打开,然后输入1234567890123456,程序再断下来。我们向下分析,有几个函数,先尝试观察这些函数的返回值。

在4026E7处,我们发现

5

eax寄存器存储了”Congratulations”的地址。因此可以认为这是一个关键跳。而在IDA中

    v9 = sub_402310(input_3) == 0;
    v10 = String;
    if ( v9 )
      v10 = (CHAR *)&v19;

跳转是根据sub_402310的返回值来判断的。因此我们可以确定,这里就是字符串的处理函数!

6

主要是一些字符交换的操作

      v5 = *((_BYTE *)v4 + 1);
      *((_BYTE *)v4 + 1) = *(_BYTE *)v4;
      v6 = 4;
      *(_BYTE *)v4 = v5;

以及

          v9 = *((_BYTE *)&v14 + v7);
          *((_BYTE *)&v14 + v7) = *((_BYTE *)&v14 + v7 + 4);
          *((_BYTE *)&v14 + v7 + 4) = v9;

最后的字符串比较部分:

LABEL_10:
    v11 = 1;
  }
  else
  {
    while ( *((_BYTE *)&v14 + v10) == (unsigned __int8)byte_583430[v10] )
    {
      if ( ++v10 >= v3 )
        goto LABEL_10;
    }
    v11 = 0;
  }

这里的byte_583430是1H@Y1S0718760Dm3因此我们可以很轻松获得结果 flag:H1Y@D1708067S1m3


Previous     Next