一、无处不在的广告(隐写)
保存图片,用Stegsolve打开,不断调试,找到二维码,扫描得答案,
二、水果(隐写)
保存图片,用Stegsolve打开,不断调试,找到二维码,
扫描得一串数,
45 46 45 46 32 45 32 46 46 45 46 32 46 45 46 46 32 46 46 46 32
45 46 46 46 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32
46 45 46 46 32
用converter万能转换器试了下,dec(十进制) to text解出的比较正常,那45,46这些应该就是ASCII码,对应的文本就是- . 空格这些字符,构成了摩斯密码密文,(这里不知道为什么,用converter转换器翻译的ASCII码少了几个空格,这就三种字符,我就手工翻译了一遍,又用python跑了一遍)
string="45 46 45 46 32 45 32 46 46 45 46 32 46 45 46 46 32 46 46 46 32 45 46 46 46 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32 46 45 46 46 32"
dou=string.split(" ")#函数返回列表
s=str()#s为空白字符串
for d in dou:
s+=chr(int(d))#d为string型
# chr()函数,参数可以是10进制、16进制的数字,返回值是当前整数对应的ascii字符。
print(s)
密文是 -.-. - ..-. .-.. … -… ..–.- -… … .-..
(这里试了几个在线解密都不对,弄了半天才发现是有个下划线没翻译过来!!!所以先数好几个字符,翻译后(一般只翻译英文字母)的字符个数少了再手工补上吧)用下面的在线解密工具,摩斯密码解密,得到结果CTFLSBBSL,翻译结果少了个下划线,CTF{lsb_bsl}。
(最后提交的答案也可以说是很坑了,竟然要小写。。。)
三、base32解码(密码)
关键语句:
3个一组ASC字符(8位),产生4个Base64字符(6位——2^6=64)。
5个一组ASC字符(8位),产生8个Base32字符(5位——2^5=32)
示例图:
用python解码base32/base64:
#base32解码
import base64
print(base64.b32decode(“输入密文”))
#base64解码
import base64
print(base64.b64decode(“输入密文”))
下面这一长串字符串,看着像base64,解码发现不是,试试base32.
*注意像下面这样的密文要记得先去掉空格
#base32解码
import base64
str="GAYDCMBR GEYTCIBQ GEYTAMBR GEYCAMBQ GEYTAMJR GAQDAMBR GEYDCMJR EAYDAMJR GAYDCMJA GAYDCMJQ GAYTAIBQ GAYTCMBR GAYCAMBQ GEYTAMBQ GEFDAMBR GEYDAMBQ EAYDCMJQ GAYDAMJA GAYTCMBQ GAYDCIBQ GEYTAMBR GAYCAMBR GEYDAMBR GEQDAMBR GEYDAMBQ EAYDAMJR GAYDCMJA GAYDCMJQ GEYTCCRQ GEYTAMBR GEYCAMBR GEYDAMBR GAQDAMBR GEYDAMBQ EAYDCMJQ GAYDCMJA GAYTCMBQ GAYTAIBQ GEYTAMBQ GAYSAMBR GEYDAMBQ GEQDAMBR GEYDAMBQ BIYDAMJR GAYDAMBA GAYTCMBQ GAYTCIBQ GAYTCMBR GEYSAMBQ GEYTAMJQ GEQDAMBR GEYDAMJR EAYDAMJR GAYDAMJA GAYDCMJQ GAYTCIBQ GAYTCMBR GEYQUMBQ GEYTAMBR GEQDAMBR GAYTCMJQ EAYDCMJR GAYTAMBA GAYTCMJR GAYDAIBQ GEYTCMBR GAYA===="
str=str.replace(' ','')#replace('c1','c2'):把字符串里的c1替换成c2。
print(base64.b32decode(str))
运行得一串二进制编码:
b'00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001\n00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111\n01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000\n00110000 01100011 00110111 00110101 00110011 00110001 00110011 00110111\n00110011 00101110 01110100 01111000 01110100'
这里讲解一下怎么变的。
ASCII表查询
base编码表查询
所以最后化成的ASCII字符构成了一串二进制密文,刚好用空格切割开来,8位二进制对应一个ASCII码。
用python(我这里先将二进制转成了十进制,再chr()找对应的ASCII)
ss='00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100011 00110111 00110101 00110011 00110001 00110011 00110111 00110011 00101110 00 01110100 01111000 01110100'
dou=ss.split(" ")#切割函数,返回字符串列表
s=str()#s为空白字符串
for d in dou:
s+=chr(int(d,base=2)) #int函数会将输入base进制的字符串转换为十进制, chr()对应ascii字符。
print(s)
运行结果:
/f6732410aadc037fb0cbaa00c7531373. txt
即为flag.
四、13岁那年(密码)
题目:MzkuM3gcK0jjqzIsqK0=
解答:先rot13解密,再base64啊!!!原来穿了个马甲。。。
五、你收到一条奇怪的短信(密码)
题目:335321414374744361715332
解答:这个题脑洞真大。。。。。其实题目有提示,就是“短信”两个字!!!九宫格打字,数字和字母有重叠的,如图:(顺便偷wp的图)
以前带小键盘的手机要按出b,要按22:2号键按两次,f是33:3号键按3次,所以将字符串两个一组分开33 53 21 41 43 74 74 43 61 71 53 32,得答案是:flagissimple
六、SQL注入(web)
题目:http://www.shiyanbar.com/ctf/1942
内容链接:http://ctf5.shiyanbar.com/web/wonderkun/web/index.html
题解:
先试了万能密码
’ or 1=’1
,
想使其变成
select * from user where username=’用户名’ and password=’密码’ or 1=’1’;
1=’1’ 永远为真来通过验证,结果,发现or被过滤了,但是单引号没被屏蔽,
要使其变成:
select * from user where 1 and 1
输入
Username: admin’=’
Password:admin’=’
select * from user where username=’admin’=” and password=’admin’=”
计算机首先计算username=’admin’,返回为0(false),再计算0=”,结果为1(true )
即可登录,得flag
另外,
关于弱类型的比较(摘自某个博客的总结):
(弱类型:偏向于容忍隐式类型转换。譬如说C语言的int可以变成double)
以下情况都会为true
1=’1’
1=’1.0’
1=’1后接字母(再后面有数字也可以)’
0=’除了非0数字开头的字符串’