2016-中国·西安 华山杯 Writeup-SeeSea
Web
签到(10)
扫码回复
hs_ctf
拿flag, 套路题。flag_Xd{hSh_ctf:WelcomeTo2016XiDian&HumenHS}
打不过~(50)
直接将submit按钮改成可点击,然后抓包,发现str
值为OGM0MzU1NTc3MTdhMTQ4NTc4ZmQ4MjJhYWVmOTYwNzk=
,拿出来解base64,然后再解一道md5,得到是1931b
,然后提交Password=1931b
,得flag:flag_Xd{hSh_ctf:XD_aA@lvmM}
系统管理(100)
http://huashan.xdsec.cn/xt 账户:admin 密码:admin 请登陆
首次发包,返回部分源码,是username
的md5值为0,所以令username
值为QNKCDZO
。
然后返回了user.php
,然后对user.php
进行发包。看到了新的源码,是一个反序列化漏洞。然后构造password=a:2:{s:4:"user";b:1;s:4:"pass";b:1;}
,向index.php
发包。得到flag:flag_Xd{hSh_ctf:kidhvuensl^$}
。
简单js(100)
来道js前菜,热身一下吧~ http://huashan.xdsec.cn/jdjs
进去后不能右键源码,其实各种查看源码的法子,例如火狐f12打开firebug,然后源码里就是简单的js而已
在控制台里运行即可得到key值,submit得到flag。或者干脆直接onclick=”return check();”去掉
弹弹弹!(150)
很简单的xss,过滤不严,<BODY ONLOAD=alert('XSS')>
xss,直接构造payload<BODY%2BONLOAD%253Dalert%2528%2527XSS%2527%2529>
233(150)
少年,老套路,你都懂得~ http://huashan.xdsec.cn/233/
查看源代码 能看到是JSfuck编码 解码
得到加密后的一句话木马
┼攠數畣整爠煥敵瑳∨䁥祳ぴ㍧≴┩>
解密得到一句话密码e@syt0g3t
得到 flag_Xd{hSh_ctf:e@syt0g3t}
无间道(200)
无间道:放你的人来我这?~ http://huashan.xdsec.cn/upload/index.php
利用“php很烦人”那题得到index.php源码,flag就在其中
正确解法:
一道上传截断题目,过程不多说。直接fuzz %80~%00中间的字符,即可上传成功,得到返回的flag。由于上传删除文件的过程有延时,可能存在竞争上传问题。
Mory try
没做出来
看了师傅们的wp
过程大概是
role参数里是两次base64编码,测试后可以注入。使用sqlmap的random user-agent绕过一下,并编写两次base64的tamper:
1 | #!/usr/bin/env python |
然后就能得到flagflag_xd{hsh_ctf:sql_succeed!}
php很烦人(200)
但php仍然是世界上最好的语言 http://huashan.xdsec.cn/php/
发包,看到源码。
1 | <!-- |
是让传三个参数user,file,pass
,然后先构造user=php://input
,post值the user is admin
。file=class.php
,pass=O:4:"Read":1:{s:4:"file";s:8:"f1a9.php";}
反序列化去读取f1a9.php
。直接出flag
。
三秒钟记忆(300)
三秒钟记忆
最近只有三秒钟记忆,忘记的事情总是要一遍一遍的找回来…
http://huashan.xdsec.cn/pic
这题也没做出来
也是看了师傅们的wp二次注入,触发点在密码找回那边。exp:
1 | import requests |
疯狂的JS(300)
疯狂的js,老师给我布置了一道js题,作为js小白的我做不到啊,大家帮忙看看吧~
这个也是没做出来的
题在出题过程中可能借鉴了 这里
payload:http://js.xdsec.cn/myajax?a=2.0&b=2.00&c=2.000&d=7&e=762
Crypto
紧急报文
解密一下这份截获的密文吧,时间就是机会!
FA XX DD AG FF XG FD XG DD DG GA XF FA
is it x or z ?
is it x or z ?
100
你可以解密这些残损的文件吗?
明文1和密文1异或得到key
密文2的key从最后个字母f开始循环
异或得到明文2
1 | # -*- coding: cp936 -*- |
分组加密检测(150)
分组加密模式检测
文件(challenge.txt)包含base64编码后的密文,其中某段密文采用的加密模式不太一样,请找出,并以该段密文base64解码后的前16个字符作为flag提交。
先全部base64解码 然后再去检测
Github上面有项目 下载下来跑一下就是了
修复一下这份邀请函部分内容(200)
修复一下这份邀请函的部分内容
红色部分就是flag 了
时间决定一切(350)
时间决定一切
考验大家人品的时候到啦!!!
http://huashan.xdsec.cn/mima/
利用“php很烦人”那题得到index.php源码,flag就在其中
1 | $ echo gjVGaqJZOnjm54LirXgElRIAOnb8oVEWfkj/7medMRU= | base64 -d | xxd |
从侧信道攻击的角度考虑,我们可以依次比较每个字符,对于不同的输入数据,执行10000次操作,耗费的时间是不同的,这样逐个字符破解,就可以得到目标值。
协议?认证?加密?(300)
协议?认证?加密?
安全也需要融合!
更新了一下代码
顺便做个分析
在流量包里面能找到关键信息
1 | T connection 0.0.0.0:12345 at Fri Sep 09 13:14:22 2016 succeed! |
DH-AES规则
先定p和g 然后双方随机 a和b
计算出A和B传给对方。双方进行运算
(g^b%p) (g^a%p)分别是B ,A
(g^b%p)^a%p=(g^a%p)^b%p
B^a%p=A^b%p ————就是Key
其中的g p是公开的。a,b是私密的。
这样就能进行加密运算了 所以我们要解密也是需要知道key的
所以只要得到** pow(B,a,p)** 或者 **pow(A,b,p) **
总结一下
A选择一个随机数c,(0<c<p),发送gc mod p给B,作为公钥;将c妥善保管作为私钥
B选择一个随机数d,(0<d<p),发送gd mod p给A,作为公钥;将d妥善保管作为私钥
此时A、B双方都能计算K=(gc mod p)**d=(gd mod p)c=(gcd mod p),即K即为A、B之间的密钥
1 |
|
Misc
Try Everything(200)
Try Everything try everything you can to get flag, and DO NOT ASK MANAGER THE FLAG.
这题的file若是直接解压的话,得到的内容是乱序的,但是仔细一看flag形式的字样都有,于是关键是如何调整顺序,这里借用binwalk
得到文件的偏移量
里面文件每个地址对应了不同的文件名(序号还不同),所以只要把里面的offset整理好,然后写个脚本分离源文件到各个小文件,然后解压,再按数字来排序就可以。
以下脚本基于自己先整理出了offset,以及建立了一个out文件夹
1 | # -*- coding: utf8 -*- |
挣脱牢笼
Reverse
Waring Up(100)
Warming Up
Crack the easy program crackme, the key is your correct inpu
Crack the easy program crackme, the key is your correct input
直接IDA打开,来到main_0(),程序主流程在这此函数里
v4获取输入,v3为输入字串长度,然后进sub_401005()进行字串处理,sub_40100A()为结果比较。先看下结果比较函数:
可以看出,处理过的输入与”VgobmndVlBVE”官串比较。
再看输入字串处理函数,sub_401005()直接跳到地址40DBF0。
关键处理操作如图:
写个小脚本
1 | target = "VgobmndVlBVE" |
到手的钥匙(100)
到手的钥匙。现在已经确定截获到一个对方用来传递密钥的程序,但是如何才能拿到密钥?
一个是帐号 一个是密码
屏幕输出一堆奇怪的东西
帐号+密码+这一堆 就是flag了
忘记用户名(100)
忘记用户名。过了好久,用户名都不记得了,难道只能重置了么
做了简单的加减
1 | a='ILoveXD' |
Help me(150)
Help me
What’s wrong with my program? Who can crack this? Do me a favor…
直接扔进IDA,如图:
其中有些空代码,还有些不太正确的语句。程序是不能正常运行的。如开始处的v10,v0等。main()函数中前面一部分主要是一些打印语句,求字串长度及一些赋值操作。这里有四个赋值下面需要用到:
1 | dword_40CF70 = 1; |
再看下面的if语句
第一个if中的v3为String的长度,String为’rev3rs3_ana1ys1s’。里面是一个do…while语句,里面是一些if 语句,根据上面列出的赋值语句,直接到达下图的关键字串处理部分:
现在逻辑就很清晰了
字串与9异或,以16进制形式输出结果。用python计算结果如图
捉迷藏(150)
捉迷藏。文件一定要保存好,不要像这个程序一样随便一diu~ PS:建议在win32环境下测试
用IDA打开 能看到用户名
密码随便输入14个1,发现14个1变为base64编码和另一串比
下断点得到base64的编码,解码得到OnYourComputer
sub_13D1D00内会把用户名+密码+ArvinShow存到
系统临时目录/flag.jpg,flag即为
FindKeyOnYourComputerArvinShow
移动迷宫(200)
移动迷宫。当赶到的时候发现对方已经提前接头了,但在现场遗留了一个U盘并恢复出了一个登陆程序,如何才能拿到密钥?
程序就是个简单的走迷宫
输入的东西,进行各简单变化,对应于走的方向
走的逻辑是
根据坐标生成方向即可,逆代码如下
1 | map_info = "***********####******#**#*****##*##********#*********#*#####***###***#*********#*********#********##" |
Do something(200)
Do something登录程序后收到了一张图片,这其中会有什么蹊跷?已更新,可以继续做题~binwalk从png中分离exe
1 | 程序让输入用户名 符合一系列条件 |
写给脚本跑一下
1 | # -*- coding: utf8 -*- |
得到
访问程序得到一个地址 访问地址 *http://reverse.****.cn/galfehttonsisiht.php**
就能得到flag了
Forensics
蒲公英的约定
蒲公英的约定
100
题目描述?小学篱笆旁的 蒲公英~
这个简单 使用stegsolve打开
能看到一个二维码
反转一下颜色 然后 扫描就得到一个类似base64字符串,但其实是base32字符串,用python的base64.b32decode即可得到flag
什么鬼(100)
什么鬼
你瞅啥?
binwal解压出一个压缩包
压缩包是有密码的 注释上写的4位数
爆破 得到密码 19bZ
打开压缩包是一个破损的二维码 PS一下就好了
客官,听点小曲儿?
这题的mp3地址不是直接提供的,而是提供了一个网站,留意网页的header,里面有key为cherrs,而mp3最常见的隐写术就是mp3Stego,找一个解密即可
1 | Decode –X song.mp3 –P cheers |
得到
1 | fdc3_#l{tsf#ahfte}gs:en_hmgcX_poe` |
就会生成文件,文件里内容是经过不规则的栅栏加密过,只要自己手工按照flag形式去调整下即可。
1 | flag_Xd{hSh_ctf:mp3stego_fence##} |
网红之路
这个比赛之后才做出来的
接着就是简单的编码问题了
Finally
一个安卓都没做出来 好尴尬。。。。