Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
462 lines (320 sloc) 23 KB
title categories date tags
黑客大赛题解
信息安全
2015-10-22 12:54:34 -0700

1

  1. 该机构的日常使用和异地备份都是用一条专线,若该专线受到破坏,则该机构没有备用的线路,此为单一故障点;
  2. 对于rookit这样的内核级驱动病毒,一般的杀毒几乎不可能完全解决,所以最好的办法还是重装吧,然后要及时打好补丁防止病毒再次光临;
  3. 如果用户不够警觉,什么攻击都可能受到,颤抖吧,地球人~不过最有可能的还是社会工程学攻击,简单来说,就是通过欺骗他人获取想得到的信息,或者达到不可告人的目的。再安全的系统也可能因为人的疏忽而出现漏洞,社会工程学找的就是这样的漏洞;
  4. (参考《0day安全:软件漏洞分析技术》)Fuzz(模糊)测试是通过向软件发送经过专门构造的带有攻击性的畸形数据,或者随机数据,用以触发软件的异常、崩溃等意外情况,来测试软件的安全性,因此可以用来发现软件的未知漏洞。Fuzz的优点是很少出现误报,能迅速地找到真正的漏洞,缺点是Fuzz永远不能保证系统里已经没有漏洞。 字典攻击用于破解未知密码,用许多可能的密码(字典)来暴力破解。 战争游击(WarDriving)用于大规模破解无线网络。 跨站伪造请求属于网络攻击了,和软件漏洞无关。
  5. 网上搜索可以找到这样的话:允许脚本输入,会给跨站注入留下机会。而对用户输入的内容进行过滤,或者重新编码,可以有效防止此类攻击。
  6. 网上搜索可以找到这样的话:在Chrome浏览器中,你可以点击绿色锁图标查看某个安全站点是否使用了完全正向保密(可以在连接的详细信息中看看它是否给出了包含字母"DHE"的密钥交换,比如“ECDHE_RSA”)。

注:第一题涉及的知识实在过于宽泛,编者表示无能为力,若有不详尽之处和疏漏还请原谅。欢迎在评论中提出修改意见~

接下来贴一下Python语言暴力破解程序,Python是一种很方便的编程语言,但鉴于许多同学没有了解过,在此不细讲。

import httplib, urllib

host = 'sec.ustc.edu.cn'
path = '/game/index.php?submit=1'
headers = {
    'Content-type': 'application/x-www-form-urlencoded',
    'Accept': 'text/plain',
    'Cookie': ''} # 在里面填入你的cookies

for v1 in range(1, 5):
    for v2 in range(1, 5):
        for v3 in range(1, 5):
            for v4 in range(1, 5):
                for v5 in range(1, 5):
                    for v6 in range(1, 5):
                        print v1, v2, v3, v4, v5, v6, ':',
                        params = urllib.urlencode({
                            'prob1': v1,
                            'prob2': v2,
                            'prob3': v3,
                            'prob4': v4,
                            'prob5': v5,
                            'prob6': v6})
                        conn = httplib.HTTPConnection(host)
                        conn.request('POST', path, params, headers)
                        print conn.getresponse().read().find('QwQ')
                        conn.close()

本题答案:1, 1, 4, 2, 3, 2


2

md5是一种很常见,并且现在看来显得有点古老、较弱的摘要算法。它能将一段任意长度的数据转换成一段固定长度的摘要,并且这个转换过程是不可逆的,因此常常用来存储密码。拿到md5值的黑客无法凭md5值得到原始密码,但掌握着真正的密码的用户可以输入密码,网站算出md5值,发现和曾经记录的md5值相符,就证明密码正确。

可惜,无数计算机正在夜以继日地计算常见字符串的md5值,因此通过md5值反查原数据是可能的。国内最好的md5反解网站是cmd5.com,将题上的md5值输入可以轻而易举查询到原数据。

本题答案:php100


3

题中已经指出这是凯撒密码,那通过简单的搜索就可以了解到:

凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。

同样我们也可以了解到,一般来说凯撒密码偏移数是3。

例如:A->D,B->E,X->A。

解密时,我们只需要将箭头倒过来就可以得出答案。但是这么长的一串字符人工翻译实在是令人头疼,所以想要挑战的同学不妨在思修课上尝试。最快捷的方法莫过于借助计算机来完成解密。C语言代码如下:

#include <stdio.h>
int main()
{
    char * p;
    p = "SohdvhhqwhuwkhqdphrisuhvlghqwrirxuvfkrrolqFklqhvh";
    int n = strlen(p);
    int i;
    for (i = 0; i < n; i++)
    {
        putchar(*(p + i) - 3);
    }
    return 0;
}

虽然这段代码有着十分明显又严重的问题(此处一个问题留给读者:上面的代码有多少不妥之处?),但是用来解决题中的这段密文却是戳戳有余了。(๑•̀ㅂ•́)و✧

输出结果:PleaseenterthenameofpresidentofourschoolinChinese

这时有些同学可能要借助谷歌翻译。由于翻不了墙,用有道词典翻译结果是:

请输入我们学校在中国总统的名字。

噫,这告诉我们应该快点去背四六级。如果我们知道它真实的意思(请输入我们学校校长的名字),那么只需要百度一下“中科大 校长”就能得到result了。不知为何感觉怪怪的(⊙_⊙)?

这种方法能够应用实际上还是多亏了坑坑学长并没有打算在前几题坑人,如果他在设计题目时用了4位、5位等偏移量,我们就得重复尝试了,这里给出一种方法让计算机打印所有可能的偏移。

#include<stdio.h>
int main()
{
     char * p, c;
     p = "SohdvhhqwhuwkhqdphrisuhvlghqwrirxuvfkrrolqFklqhvh";
     int n = strlen(p);
     int i, diff;
     for (diff = 1; diff < 26; diff++)
     {
         for (i = 0; i < n; i++)
         {
             c = *(p + i);
             if (c >= 'a' && c <= 'z')
                 if (c - diff >= 'a')
                     putchar(c - diff);
                 else
                     putchar(c + 26 - diff);
             else
                 if (c - diff >= 'A')
                     putchar(c - diff);
                 else
                     putchar(c + 26 - diff);
         }
         putchar('\n');
     }
     return 0;
}

一行一行看下来,相信聪明的同学们一定马上能看出来哪一行是正确的。

本题答案:万立骏


4

本题有三个解法:数学计算、计算机模拟、暴力破解。

数学计算法需要设:

  • a1=直到点数之和除以5余1,平均期望投掷次数
  • a2=直到点数之和除以5余2,平均期望投掷次数
  • a3=直到点数之和除以5余3,平均期望投掷次数
  • a4=直到点数之和除以5余4,平均期望投掷次数

显然有以下关系:

  • a1 = 1 + (0/6 + a4/6 + a3/6 + a2/6 + a1/6 + 0/6)
  • a2 = 1 + (a1/6 + 0/6 + a4/6 + a3/6 + a2/6 + a1/6)
  • a3 = 1 + (a2/6 + a1/6 + 0/6 + a4/6 + a3/6 + a2/6)
  • a4 = 1 + (a3/6 + a2/6 + a1/6 + 0/6 + a4/6 + a3/6)

联立解方程即可。又显然,最终答案 = 1 + (a1/6 + a2/6 + a3/6 + a4/6 + 0/6 + a1/6)

计算机模拟的C语言代码如下:

#include <stdio.h>
#include <stdlib.h>
#define TIMES 100000 //次数已经足够,如果想要更多数据以提高精确性,需要使用malloc函数
int main()
{
     int i, j, sum, sum_, a[TIMES], rnd;
     for (i = 0; i <= TIMES - 1; i++)
     {
         sum = 0; //sum指示连续掷骰子的和 每次循环前重置
         j = 0;   //j指示指示连续掷骰子次数 每次循环前重置
         do
         {
             rnd = (rand() * 6 / RAND_MAX) + 1; //rnd指示每次掷骰子得到的数字
             sum += rnd;
             j++;
         }
         while (sum % 5 != 0);
         a[i] = j;                    //a[i]记录了每次达到得到五的倍数时所需要的次数
     }
     sum_ = 0;
     for (i = 0; i <= TIMES - 1; i++) //求得平均次数,可以预测数学期望
     {
         sum_ += a[i];
     }
     printf("%f", (double)sum_ / TIMES);
     return 0;
}

暴力破解法需要从1.01起向上穷举,建议使用Python语言进行网络发包。具体代码可参考第一题暴力破解法。由于大多数读者可能不了解Python,而了解的人应该都会写,此处略过。

本题答案:5.00


5

页面上隐藏信息,最容易想到的就是HTML文档中的注释了,所以鼠标右键-查看页面源代码肯定是第一步。一路拉到下方,会看到这样一句降低难度的话:

源代码

cookie是我们上网时,网站委托浏览器保存的一些小数据,一般用来标识我们的身份。比如这次大赛,我们登录后就会得到一个cookie,如果清除浏览器cookie,就必须重新登录了。鼠标右键-查看页面信息-安全-查看Cookie,可以找到名叫Result的cookie。

cookie

其中含有转义字符%26%7E,分别代表&~,这个知识很容易搜索得到。

本题答案:SCGYSU&SEC~aHa


6

本题在主办方被社工掉之后替换,难度大幅度降低,也多了许多提示。

提示一与替换前相关,只用来表示加密方式不同。

提示二暗示了本题答案可能的格式。

提示三说明答案可能不能通过图像变换得到。

提示四的k准确的说是16,也就是竖着看。

解答步骤:

1、用Winhex或任何十六进制编辑器打开。

2、拉到最下方。

3、一个一个读出十六进制框的第一列的字符(然后还拐了个弯,请自行查看)。

4、吐槽一番,然后过关。

本题答案:flag{ustc-change-your-password}


7

上网搜索“社工库”,这是一类保存了曾经泄漏的各种个人隐私和密码的数据库。根据提示“下雨天抬头看”, 我们选择“搜云”这个网站,输入账号即可查询到:

soyun截图

下面的GPA计算无需解释吧……有疑问的自行翻看入学手册。提示,课程的学分需要去教务处查询,mis.teach.ustc.edu.cn,可能还需要试试之前的各个学期,才能找到该课程。

本题答案:wangdayong520


8

这是一道逆向工程题,所谓逆向工程,就是已知编译后的程序(.exe),反推出程序运行方式(源代码)。首先要指出的一点是,这个程序运行时会闪退,没有任何输入输出,因为出题人根本就没写输入输出语句,因此非进行逆向工程不可。

此时,或许我们首先应该去搜索一下,什么叫作Feistel结构?不难搜到这张图:

Feistel结构

左侧由上而下是加密算法,右侧由上而下是解密算法,K代表密钥,F代表一个函数,圈中十字那个符号代表异或(XOR)运算,在C语言中对应的运算符是^

可以看出,Feistel结构的加密算法首先需要一组密钥(K0~Kn),一个函数(F)。它将输入的原文分为两个部分,暂且称为L和R,不断重复以下过程:

  1. 将R和K进行F运算,得到的结果再和L做异或运算,得到的结果成为下一轮的R;
  2. R直接成为下一轮的L。
  3. 例外:最后一轮后不交换L和R。

解密过程完全相同,只不过把K全都反过来了,先用Kn,最后用K0。于是,确定算法的K和F就是我们接下来的目标。

逆向工程用什么工具好呢?在网上稍作搜索,很容易发现一款叫作IDA的软件被称为神器,因为它包含一个Hex Rays插件——能产生C语言源代码(当然可读性肯定还是比不上真正的源代码),而不像别的反汇编工具只能产生汇编语言源代码。对于新手和初学者,当然是C语言比较容易读懂了。我们下载、安装并使用IDA处理这个程序,如图导出全部C源代码:

用IDA导出C代码

这里插一句:即使源代码只有main一个函数,编译时编译器也会加上很多东西,这导致反编译出的代码中有一大堆搞不懂在干什么的函数。不过不用管它们,我们快速的寻找可能是加密算法的程序段——加密算法含有异或运算,所以直接在代码中搜索^符号应该就能找到它。可以注意到这一段程序最为可疑,它不调用别的奇奇怪怪的函数,还包含一些不知道代表什么的常数,并且大量使用异或运算(多到我不换行就没法把那一行放在这个页面中了),这很像加密过程:

int sub_401500()
{
  signed int v0; // ebx@1
  int v1; // esi@2
  int v2; // ecx@2
  signed int v4; // [sp+14h] [bp-18h]@1
  int v5; // [sp+18h] [bp-14h]@0
  int v6; // [sp+1Ch] [bp-10h]@0

  sub_401F10();
  v4 = 0;
  v0 = 225052;
  while ( v4 <= 15 )
  {
    v1 = v6;
    v2 = ((v0 + v6) << 8)
       ^ v6
       ^ 2 * v0
       ^ (v6 << (v0 + 8))
       ^ v0 * (v6 + 4)
       ^ (25998 * v6 + 174 * v0)
       ^ v5;
    if ( v4 % 3 == 1 )
      v0 = __ROL4__(v0, 1);
    else
      v0 = __ROL4__(v0, 2);
    v6 = v2;
    v5 = v1;
    ++v4;
  }
  return 0;
}

中间调用的sub_401F10经过检查后可以发现并没什么值得注意的,就忽略吧。我们接下来的任务是搞清楚v0v1v2v4v5v6都是存储什么的。很容易看出v4是从0到15的循环变量,我们命名为i。观察v2=…那一段,可以发现是v0和v6先进行了复杂运算,结果再与v5进行异或运算,结果存入v2,最终又存入v6。因此有理由推测v5是L,v0是K,v6是R,v2是一个临时存储R的新值的变量,那一大段运算是F。另外,v1是一个临时存储L的旧值的变量。

等等,不是说K有很多个,应该是16轮计算中K各不相同吗?怎么成了v0呢?请看,在循环的后面,有一个动作是v0 = __ROL4__(v0, 1);v0 = __ROL4__(v0, 2);。上网搜索可知,__ROL4__代表“向左循环移位”,这就是在旧的v0的基础上产生出一个新的v0给下一轮用啊!而且,v4是否为3的整数倍,决定了新的v0是怎么产生的。我们可以使用下面这段程序得到全部16轮使用的K:

void getKs(int K[16])
{
    int i, v0 = 225052;
    for(i = 0; i < 16; i++)
    {
        K[i] = v0;
        if ( i % 3 == 1 )
            v0 = __ROL4__(v0, 1);
        else
            v0 = __ROL4__(v0, 2);
    }
}

其中的__ROL4__的算法如下:

int __ROL4__(unsigned int v, int n)
{   return (v << n) | (v >> (32 - n));   }

而F也很容易写出:

int F(int R, int K)
{
    return ((K + R) << 8)
         ^ R
         ^ 2 * K
         ^ (R << (K + 8))
         ^ K * (R + 4)
         ^ (25998 * R + 174 * K);
}

综上所述,对变量名进行修改,对程序进行简化后,加密过程其实就是:

void Encrypt()
{
    int K[16], t, i, L, R;
    getKs(K);
    for(i = 0; i < 16; i++)
    {
        t = R;
        R = F(R, K[i]) ^ L;
        L = t;
    }
}

把K反过来使用,得解密过程:

void Decrypt()
{
    int K[16], t, i, L, R;
    getKs(K);
    for(i = 0; i < 16; i++)
    {
        t = R;
        R = F(R, K[15 - i]) ^ L;
        L = t;
    }
}

为L和R赋初始值2和1(顺序是试出来的,以上程序都没有考虑结束时是否交换一次L和R的问题,所以可能要用不同的顺序多试试),运行加密过程并打印结束时的L和R,可以确认我们的程序是正确的。为L和R分别赋初始值860103762和1574863430,运行解密过程,便得到答案。

另一种解法:暴力破解……虽然极不推荐,但有人居然成功了,出于神人共欣赏的考虑,将他的解法也收录于此……

首先,为什么说不推荐呢?因为a和b都是int型整数,合起来可能的解有18446744073709551616种,若检验一个解的时间是1纳秒(事实上一般CPU1纳秒只能执行几条指令),那么需要585年才能穷举完所有解。但是!在有人劝说别人放弃暴力破解的尝试时,他无意间说“答案都是六位数”,暴露了这道题答案数字小的缺陷。如果已知a和b都是六位正整数,解就只有810000000000种了,每个解花10纳秒,只需要2.25小时就能穷举完。这使得@Core i5 2nd Generation 同学用一上午暴力破解跑出了答案!(注:他当然不能不断尝试在网站上提交,那样太慢了。他是写了个main,不断调用逆向工程得到的那个加密函数,在本地进行破解的。并且他将解分为了7部分,同时开7个程序各占一个线程进行尝试)

本题答案:(517966,245292)


9

点击进入银座商店

smallgame

银座商店的商品是多样化的,话费区的花是无奈的。

我们拥有一张一卡通,卡里的钱有1,000,000+,这也意味着我们可以购买的商品仅有九样。

提示:也许您要想办法挣挣钱,然后还要多刷新随机事件。

(注:刷新随机事件实际上是重新访问该页面,可以通过F5来加快刷新速度,但是随机事件产生最短间隔是两秒,所以不必操之过急)

一开始刷新事件并没有更多提示,那么怎样挣钱?你可以通过不断尝试来筛选出每个物品的作用。最后可以得知只有五样商品有特殊的意义,但是其它七样也有它们存在的价值(不要小瞧便宜货,它们也是游戏的关键)。

麻辣香锅秘方:秘方里藏有来自青岛的神秘力量,你可以通过销售麻辣香锅,日入数万(通常在30,000到50,000波动),但有时 38元/一丝肉纤维 的价格还是会引起麻烦。(重复购买无效)

绩点精灵:神奇的精灵,将你的绩点定义为最高的绩点,于是你能包揽每次郭沫若超级奖学金(获奖时间并不固定,一般相隔不超过五次,奖金为100,0000 * 绩点精灵数,400,000封顶)。

神圣三道具:超难的微积分试卷、降雨的小火箭、珍贵的化学试剂。(集齐三道具,你将进入神秘的异时空)

在这之后,提示将在这两条之间重复:

  1. 先买齐神圣三道具,预备好进入异时空的时候,要缴纳 2 元手续费。
  2. 建议购买四个绩点精灵和一个麻辣香锅配方。

提示1说明了三道具的作用,莫名其妙的两元在此处并没有头绪。

提示2则告诉我们怎样赚钱最快,所以要尽早集齐四个绩点精灵和一个麻辣香锅配方。

在完成提示2后,如果我们继续攒钱,会发现卡里钱超过2,000,000元时,不会再有随机事件收入。这其实是在引导我们购买神圣三道具。

在购买完神圣三道具后,神秘的异世界大门就打开了,里面的珍宝就是.......奇异的铁氧体,同时校园一卡通进化成了校园一卡通(异世界)。

提示: 你进入了商店的异时空,如果您要退出异时空,您的神圣道具会消失。

4,294,967,295元!!!!!

根据规则,进入异世界是我们只有几万元,这显然是无法满足铁氧体的价格的,更何况,这价格完全是敲诈啊(〃>皿<)。

但是作为一名码农,这个数字总觉得有些特殊的意义。

4,294,967,295 = 2 ^ 32 - 1;

啊哈,这刚好是C语言中32位的unsigned int 类型变量所能存储的最大的值。这时这道题的key浮出水面:数据溢出。再联想到提示1(进入异世界要缴纳2元手续费),我们可以想办法使得购买完门票后数据恰好溢出。

4,294,967,295 + 2 = 1;

暂时,我们并不能做到这些,只能暂且退出来。虽然神圣道具全部消失,但是郭奖那么多,怕啥。重新买到神圣道具中的两样,购买最后一个神圣道具前,将钱控制到2,000,001,再买下神圣道具,进入异世界,就能导致你的钱数变成-1,恰好溢出为铁氧体价格~这时,便宜货的作用就出来了,它们能帮助你花掉自己的金钱,来使钱数=2,000,001。(此处有一问:为什么最便宜的是7元和4元呢?)

(这里要注意,如果恰好2,000,000并不会导致数据溢出,而是导致一次随机事件更新,那么在异世界你就只有随机事件带来的那么点钱了,这可能是坑坑学长故意设置的。)

铁氧体上面用实验室的小刀刻了一行字:“全院办学,所系结合”。

商店的(坑坑)大叔鼓掌向你微笑着,“你是我见过最聪明的科大人之一...现在继续你的信息安全大赛之旅吧!”

密码:flag{qUanyuAnbaNXue-Suox1jiehE}

MORE:大家玩过这个有趣的小游戏之后,也都意识到了数据溢出的严重性。不过,有时问题也可以变得有趣,就像这个精致的小游戏一样。为了大赛制作出来的小游戏虽小,但它蕴含的可能性是无限的,欢迎大家脑洞大开,为这款游戏提出更多创意。

本题答案:flag{qUanyuAnbaNXue-Suox1jiehE}


10

这道题,说白了就是考察你会不会使用好的搜索引擎……取关键词“科大”、“香港”、“交流”、“往大的说是”,再取条件限制“许多年前”,排除掉最近一年多的结果,使用百度只能搜到三篇转载文章,而使用谷歌或必应(后者无需翻墙)皆可搜索到科大校园网上的原始文章,这个原始文章的脚注中含有课程编号,转载的没有。

本题答案:lecture, tutorial, lab, COMP327, 中科大没有尽到教育的责任, 会损害中科大的声誉, 龙卫公司, 彩虹清洁, 抄袭, 作弊


11

到此,这次初赛就结束了。虽然可能无法祝贺屏幕前的你完成初赛,但全体主办人员和题目解析编写组成员真心地祝贺你一路阅读到这里,学到了这么多知识和技术。愿你能喜欢上信息安全这个领域,对它有更多了解和关注,这样本次大赛的目的也就达到了。

最后感谢关注我的博客,作为读者的你是这篇博文乃至这个博客最重要的部分!

题目解析编写组:Snake,lijh2015,tecog,X

2015-10-23