hgame-2018 CTFwp(杭电信安)week1

原题链接
由于开放时间短,不知道什么时候结束。我会将题目的大致内容以图片形式down下来。

web


1 Are you from Europe?


URL http://123.206.203.108:10001/European.html

一看题,就感觉想是用burp抓包做,来自欧洲,就想到改语言,accept-langue字段。
但是,我试了en,gk等等值,并没有什么卵用。而且发现动态调用是用js实现的也就是说,没有调用服务的数据。

于是想到可能是在js里设了坑。

查看源码:

发现猫腻eval, 于是换成alert ,查看函数内容:

function soHappy(){var buy=confirm("SSR!欧洲人,你愿意献祭你全部的 SSR 来获取 flag 吗?");
if(!$("#serv5").html()&&!$("#craft5").html()){alert("你根本不是欧洲人。");return}
var flag="";flag+="";flag+="";flag+="";flag+="hgame";flag+="{";flag+="T";flag+="h";
flag+="3";flag+="_";flag+="C";flag+="h";flag+="0";flag+="s";flag+="e";flag+="N";flag+="_";
flag+="0";flag+="n";flag+="E";flag+="!";flag+="}";if(buy){$("#serv5").remove();$("#craft5").remove();
alert("兑换成功。flag: "+flag)}else{alert("你失去了唯一的机会。")}}

相信大家的机智,都看到flag了。

flag: hgame{Th3_Ch0seN_0nE!}

知识点: js审计

反思: 这题容易被题目本身带到抓包http协议的道上,但是这是错的。本身网页只是js动态,没有服务器请求。

2 special number


URL http://118.25.18.223:10001
进url,是一段php源码:

include_once("flag.php");
    if(isset($_GET['key'])){
        $pattern = '/^(?=.*[0-9].*)(?=.*[a-zA-Z].*).{7,}$/ ';
        $key = $_GET['key'];
        if(preg_match($pattern,$key)===0){
            echo "格式错误";
        }else{
            $lock="******************";
            $b = json_decode($key);
            if($b==$lock)
                echo $flag;
            else
                echo "this is no special number";
        }
    }

下面开始审计:
1. 读懂这段正则

$pattern = '/^(?=.*[0-9].*)(?=.*[a-zA-Z].*).{7,}$/ ';

(?=.[0-9].) 包含0-9任意字符
(?=.[a-zA-Z].) 包含a-zA-Z任意字符
{7,} 7位以上

  1. json_decode
    用于将json字符串,解密成对象或数组。
  2. $lock是不知道的,但是由于用的是==,不对类型做比较,因此需要做的是绕过!!!
  3. 关于php弱类型,一篇很好的总结
var_dump("admin"==0);  //true
 var_dump("1admin"==1); //true
 var_dump("admin1"==1) //false
 var_dump("admin1"==0) //true
 var_dump("0e123456"=="0e4456789"); //true 
?>  //上述代码可自行测试

因此,可以利用0==”string”,来绕过。

payload: key=0e1233248
flag: hgame{pHp_w34k_typing_s000_e4sy}

**知识点: **php弱类型,正则

反思: 我一开始,被json_decode 带跑了,试了各种
?key={“key”:0}
?key={“b”:0}
但是都不对,感觉这个json_decode 没什么用,尽迷惑人。

3. can u find me?


意思明显,这题是关于robots协议的,robots协议是规定爬虫限制的。
查看robots协议,加上/robots.txt即可。

看到disallow,不被允许爬取的页面是/f1aaaaaaaag.php

但是我可以访问呀!

下面容易想到了: Burp修改请求的字段值

guest-> admin 即可。

知识点: robots协议,http请求

flag: hgame{78e01ee77a39ef4e}

4. tell me what you want


URL: http://123.206.203.108:10001/
BP改就行了,一步步来,一开始Burp改POST,发现一直不对,hin烦。后来用hackbar改就行了,抓包貌似没什么区别。。。

知识点: http请求
flag: hgame{For9e_hTTp_iS_N0T_HArd}

5.

我们不一样
描述
知识点:PHP弱类型
URL http://118.25.18.223:10002/
基准分数 50
当前分数 50
完成人数 189

include_once("flag.php");
    if(isset($_POST['str1'])&&isset($_POST['str2'])){

        if ($_POST['str1']!=$_POST['str2']&&strcmp($_POST['str1'],$_POST['str2'])==0) {
            echo "flag is:".$flag;
            exit();
        } else{
            echo "Something wrong..";
        }
    }

这里考的是php弱类型,php中内置函数strcmp有不合理的地方:

strcmp()函数在PHP官方手册中的描述是int strcmp ( string str1,string str2 ) ,需要给strcmp()传递2个string类型的参数。如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。

如果传入给出strcmp()的参数是数字呢?

$array=[1,2,3];
var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false

payload:str1[]=[1,2,3]&str2=123
知识点: php弱类型
flag: hgame{g3t_f14g_is_so0000_ez}

msic


白菜1

描述
白菜1,希望大家多多关注国漫
知识点:图片隐写lsb
URL http://p1kaloi2x.bkt.clouddn.com/flag.png

提示很清楚了,LSB隐写。看到PK,保存为zip,7-zip打开。即看到flag。

白菜2

描述
还是我老婆hhh
知识点:初识文件结构
URL http://p1kaloi2x.bkt.clouddn.com/misc2.jpg

由于是jpg,联系文件结构,容易想到图种。

pacp1

wireshark 打开, 搜索hgame,即得。

crypto

easy Caesar


vuoas{Hvs_ei8qy_pf7kb_1l_xIadg_cjSf_o_Zo9m_rCu}
凯撒加密,python脚本解密即可,注意数字又要进行移位。
flag: hgame{The_qu1ck_br0wn_4x_jUmps_ovEr_a_La2y_dOg}

Polybius


hgame{FDXDGDADDG_FXXFAAXFAG_GDFXFFXFFXADXFDA_GDAD}
棋盘密码,我是手解的。

flag: hgame{fritz_nebel_invented_it}

confusion

密文: –/.-./.-../-/-.-/-…./-.-/-..-/-./…-/–../-..-/–.-/.–/-…/…/-./.-/..—/..-./…/..-/..—/–./–./-…/…/.–/….-/…../-…/…/.-../.-/–../..-./..-/-…./…/…-/.—/-…/-./-../.-/–../…/.-./…./..-/-…./–.-/-…-/-…-/-…-/-…-

混合了很多种加密,但是不难看出:

第一个是莫尔斯电码;
解得MRLTK6KXNVZXQWBSNA2FSU2GGBSW45BSLAZFU6SVJBNDAZSRHU6Q;
由于数字只有2-6,容易猜测是base32;
解得:dW5yWmsxX2h4YSF0ent2X2ZzUHZ0fQ==
由于有大小写,推测是base64;
解得:unrZk1_hxa!tz{v_fsPvt}
容易想到栅栏密码。
转换为utnzr{Zvk_1f_shPxvat!}

简单的凯撒密码:
hgame{Mix_1s_fuCking!}

虽然不难,还是很想fuc*

Hill

希尔密码(Hill Cipher),是运用基本矩阵论原理的替换密码,每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果mod26。用作加密的矩阵(即密匙)必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的。
https://www.cnblogs.com/xdjun/p/7472735.html

一步步计算,就可以了。
我找到了一个站,有更详细的介绍和脚本。
www.practicalcryptography.com/ciphers/hill-cipher/

baby step


pow(0x1111111111,flag,0x976693344d) = 0x7ac21f64ed

不会,查了很多资料才知道BSGGS算法。python脚本:

from math import ceil, sqrt

def bsgs(g, h, p):
    N = ceil(sqrt(p - 1))
    tbl = {pow(g, i, p):i for i in range(N)}
    c = pow(g, N * (p - 2), p)
    for j in range(N):
        y = (h * pow(c, j, p)) % p
        if y in tbl:
            result=(j * N + tbl[y])
            print(hex(result))
    return None
print(bsgs(0x1111111111, 0x7ac21f64ed , 0x976693344d))

flag : x1337

你可能感兴趣的:(CTF)