Bugku 部分WP
Misc
图穷匕见
这题主要学习了kali下gnuplot的使用
下载得到
binwalk分离不出东西,用winhex看到文件尾部有一堆
应该是十六进制,原文件剪切出来保存为txt文件,用notepad++打开,plugins->converter->hex->asc||
得到
应该是要画图,用notepad++去掉,和() Ctrl+F,这一步是为了符合kali下gnuplot的格式
kali打开gunplot ,使用命令plot 1.txt得到
扫码得到flag{40fc0a979f759c8892f4dc045e28b820}
参考https://www.cnblogs.com/zaqzzz/p/9469828.html
QAQ
这道题主要学习STEGOSAURUS的使用
题目给的cipher.txt可得
FSAnRAIzNlMjPQMjNyBJNTs6NlIFPFIqDDVTJy0zGE8rKxZBJDIrJkYoPUQML1M3MDYJZTElFyI7
UzE6DTtSNxckNDw2Mxk9Jzc=
下载得到QAQ文件,winhex打开
有这个判断与python有关,后缀名改为.pyc,反编译一下得到
cypher转base64并保存为十六进制,再通过python的eval()函数转为asc||码
python脚本为
cyp=[21, 32, 39, 68, 2, 51, 54, 83, 35, 61, 3, 35, 55, 32, 73, 53, 59, 58, 54, 82, 5, 60, 82, 42, 12, 53, 83, 39, 45, 51, 24, 79, 43, 43, 22, 65, 36, 50, 43, 38, 70, 40, 61, 68, 12, 47, 83, 55, 48, 54, 9, 101, 49, 37, 23, 34, 59, 83, 49, 58, 13, 59, 82, 55, 23, 36, 52, 60, 54, 51, 25, 61, 39, 55] key = 'LordCasser' cipher = '' for i in range(74): cipher += chr(ord(key[i % len(key)]) ^ (cyp[i])) print cipher 得到 YOU ARE FOOLED THIS IS NOT THAT YOU WANT GO ON DUDE CATCH THAT STEGOSAURUS
可知是用STEGOSAURUS进行隐写,具体方法参考
https://www.cnblogs.com/ECJTUACM-873284962/p/10041534.html
把QAQ.pyc放入kali里解一下即可得到
神秘的文件
这题学习到了怎么使用archpr进行明文攻击
下载得到rar文件
需要密码,通过archpr判断其为rar伪加密
使用winrar修复
winrar解压修复后的文件,发现一个加密文件夹和一张png图片
将png文件压缩,用archpr进行明文攻击
得到word文档和logo图片
binwalk分解word文档,在flag.txt中找到base64加密的flag,解密即可得到flag
思考:
1.伪加密文件可以使用winrar进行修复
2.加密文件中存在和外围文件夹中相同的文件时,可以考虑将该文件压缩成与加密文件同格式的文件,使用archpr进行明文攻击
3.所有的压缩和解压缩都要用winrar操作,要不然明文攻击会失败
一枝独秀
winhex打开,得知是一个zip
修改后缀名,打开得到一枝独秀.zip
ARCHPR暴力解密得到密码为12345678
解压得到一堆jpg图片,发现第81号大小与其他图片不一致
打开属性看到
这个flowers后面应该有用
使用jphs05打开flowers(81).jpg
使用seek,密码为上面提到的flowers
保存为1.txt
打开1.txt,发现PK,可知这是zip文件
将其保存为1.zip
打开得到参悟佛法.txt
打开得到
这是与佛论禅加密
在此处进行解密
http://www.keyfc.net/bbs/tools/tudoucode.aspx
注意,把佛法写在下面的框中,再点击参悟佛所言的真意,在上面的框中得到
H-hDs10OZL3lhIZZbeRSbbbVRZNm32W2X33mGm3Txt999RdV9hx0
使用栅栏解密得到
HINT-ZmxhZ3tDb29seW91R290SXROb3dZb3VLbm93VGhlRmxhZ30
把HINT后面的东西拿去做base64解码即可得到flag
不简单的压缩包
binwalk分离出两个压缩包,分别存有flag.swf和tingshuo.txt
其中一个用ARCHPR跑出来密码为0
得到tingshuo.txt,打开提示密码有50位
从大佬那儿得知这50位的密码全是一样的
经测试,密码为50个a
打开得到flag.swf,是一个游戏
用JPEXS Free Flash Decompiler打开
搜索player,进到该处的代码段
发现在此处的k有问题
拿出来做一个base16的解码即可得到flag
WEB
秋名山老司机
#!/usr/bin/python2.7 #coding:utf-8 import re import requests import sys; reload(sys); sys.setdefaultencoding("utf8") s = requests.Session() r = s.get("http://123.206.87.240:8002/qiumingshan/") searchObj = re.search(r'^<div>(.*)=\?;</div>$',r.text,re.M | re.S) # ^匹配字符串开头 $匹配字符串末尾 # (.*) 第一个匹配分组,.* 代表匹配除换行符之外的所有字符。 ''' re.I 忽略大小写 re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境 re.M 多行模式 re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符) re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库 re.X 为了增加可读性,忽略空格和 # 后面的注释 ''' d = { "value":eval(searchObj.group(1)) #执行找到的第一组 } r = s.post("http://123.206.87.240:8002/qiumingshan/",data=d) f = open("aa.txt",'w') f.write(r.text) f.close()
速度要快
import base64 import requests import re import sys; reload(sys); sys.setdefaultencoding("utf8") url = "http://123.206.87.240:8002/web6/" r = requests.Session() s = r.get(url) flag = s.headers['flag'] mid = base64.b64decode(flag) #print mid mid = mid.decode() #print mid.split(':')[1] flag = base64.b64decode(mid.split(':')[1]) #print flag data = {'margin':flag} #print data print r.post(url,data=data).text
前女友
题目如下
<?php if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){ $v1 = $_GET['v1']; $v2 = $_GET['v2']; $v3 = $_GET['v3']; if($v1 != $v2 && md5($v1) == md5($v2)){ if(!strcmp($v3, $flag)){ echo $flag; } } } ?>
payload为?v1[]=1&v2[]=2&v3[]=1
两个数组的哈希值为0
php5.3以后的版本strcmp函数将数组与字符串比较时,返回0
login1SKCTF
sql约束,注册时账号为admin 1,密码Aa12345,即可登录
你从哪里来
抓包,将referer改成https://ww.google.com即可得到flag
MD5 collision
两个不同的值MD5后却相同即成为md5碰撞
payload为http://123.206.87.240:9009/md5.php?a=s214587387a
常用的碰撞的MD5:
0e开头的md5和原值:
s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514 s1502113478a 0e861580163291561247404381396064 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s155964671a 0e342768416822451524974117254469 s1184209335a 0e072485820392773389523109082030 s1665632922a 0e731198061491163073197128363787 s1502113478a 0e861580163291561247404381396064 s1836677006a 0e481036490867661113260034900752 s1091221200a 0e940624217856561557816327384675 s155964671a 0e342768416822451524974117254469 s1502113478a 0e861580163291561247404381396064 s155964671a 0e342768416822451524974117254469 s1665632922a 0e731198061491163073197128363787 s155964671a 0e342768416822451524974117254469 s1091221200a 0e940624217856561557816327384675 s1836677006a 0e481036490867661113260034900752 s1885207154a 0e509367213418206700842008763514 s532378020a 0e220463095855511507588041205815 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s214587387a 0e848240448830537924465865611904 s1502113478a 0e861580163291561247404381396064 s1091221200a 0e940624217856561557816327384675 s1665632922a 0e731198061491163073197128363787 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s1665632922a 0e731198061491163073197128363787 s878926199a 0e545993274517709034328855841020
程序员本地网站
抓包构建X-Forwarded-For头为127.0.0.1即可得到flag
数组返回null绕过
源代码
<?php $flag = "flag"; if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) echo 'You password must be alphanumeric'; else if (strpos ($_GET['password'], '--') !== FALSE) die('Flag: ' . $flag); else echo 'Invalid password'; } ?>
以下文字来自https://hackfun.org/2018/01/09/CTF%E4%B8%AD%E5%B8%B8%E8%A7%81PHP%E7%89%B9%E6%80%A7%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#15-strpos%E6%95%B0%E7%BB%84%E7%BB%95%E8%BF%87NULL%E4%B8%8Eereg%E6%AD%A3%E5%88%99-00%E6%88%AA%E6%96%AD
strpos()找的是字符串,那么传一个数组给它,strpos()出错返回null,null!==false,所以符合要求.
那为什么ereg()也能符合呢?因为ereg()在出错时返回的也是null,null!==false,所以符合要求.
PHP_encrypt_1(ISCCCTF)
密文
fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=
<?php function encrypt($data,$key) { $key = md5('ISCC'); //key=729623334F0AA2784A1599FD374C120D $x = 0; $len = strlen($data); $klen = strlen($key); //klen=32 for ($i=0; $i < $len; $i++) { if ($x == $klen) { $x = 0; } $char .= $key[$x]; $x+=1; } for ($i=0; $i < $len; $i++) { $str .= chr((ord($data[$i]) + ord($char[$i])) % 128); } return base64_encode($str); } ?>
解密脚本
#coding:utf-8 s = [0x7d ,0x1e ,0x1a ,0x1d ,0x6c ,0x2e ,0x14 ,0x26 ,0x18 ,0x57 ,0x27 ,0x45 ,0x47 ,0x13 ,0x2a ,0x1e ,0x18 ,0x42 ,0x28 ,0x1b ,0x1e ,0x1f ,0x57 ,0x5b ,0x17 ,0x28 ,0x2b ,0x47 ,0x12 ,0x16 ,0x27 ,0x55 ,0x18 ,0x16 ,0x1a ,0x2d ,0x16 ,0x30] key= '729623334F0AA2784A1599FD374C120D' key = key.lower() a = '' for i in range(38): a += chr((s[i]-ord(key[i%32]))%128) print a