杂项第一题: color
下载压缩包:https://ctf.bugku.com/files/b5f4b306f5cb020e91308895cf5ad767/81cf84c2-0901-46d8-80c7-f0844e7e5253.zip
下载解压后 发下是 0-6 一共七张图片
查看属性没什么发现
那么我们在 StegSolve中依次查看 发现!!!!!!!
Make me tall
让我变高
发现提交不了 那么 意思是让我变高 那么我们就在 十六进制编译器里面把他们都变高看看
IHDR后八个字节
改高后,看图
白和黑,我们把其他图也改了
我们
把白色转为0 黑色转为1
得到七串二进制
11111111010111101111
11111011111110111111
00001100101010110001
01001010010000001101
11010011011101010111
10011011011010110110
00111001101101111101
发现第一列从上到下的二进制码刚好对应 的ascii码
1100110 对应 f
c1 = '11111111010111101111'
c2 = '11111011111110111111'
c3 = '00001100101010110001'
c4 = '01001010010000001101'
c5 = '11010011011101010111'
c6 = '10011011011010110110'
c7 = '00111001101101111101'
flag = ''
for i in range(0,20):
c =c1[i]+c2[i]+c3[i]+c4[i]+c5[i]+c6[i]+c7[i]
flag += chr(int(c,2))
print flag
得到
flag{Png1n7erEs7iof}
杂项第二题: 小明的密码
97年出生的小明用自己的生日作为自己网站的密码,现在,得到一串被篡改过一个字符的字符串,你能解出小明的生日吗?
0175501585710a89h5a60dc9ed2f88d7
md5加密
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import hashlib
s = '0175501585710a89h5a60dc9ed2f88d7'
for day in range(1, 32):
for month in range(1, 13):
birth = '1997%02d%02d' % (month,day)
m = hashlib.md5()
m.update(birth)
md5 = m.hexdigest()
if s[:10] in md5: #以部分字符串的值来对比完整字符串
print md5
print birth
杂项第三题: 仿射加密
已知仿射加密变换为c=(11m+7)mod26,试对密文dikxourxd解密
一、脚本解密
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
a = 'dikxourxd'
a1=[]
for i in a:
a2 = ord(i)-97
a1.append(a2)
print a1
s = ""
for i in a1:
for j in range(0,26):
c = (11*j+7)%26
if(c==i):
s += chr(j+97)
print s
二、网站解密
工具解密
杂项第四题: 黑客的机密信息
黑客通过webshell往Web服务器写入了一串机密信息,你能找出机密信息吗?
首先分析流量包,过滤http请求,在数据包末端发现shell.php,利用Wireshark的filter过滤出带有shell.php的流量,http contains"shell.php"
利用一句话执行的命令都经过base64编码,不能直接搜索到flag关键词。
通过跟踪流来查找flag
仿射密码解析与实例
仿射密码
原理
仿射密码的加密函数是 E(x)=(ax+b)(modm)
,其中
-
x表示明文按照某种编码得到的数字
-
a和 m互质
-
m是编码系统中字母的数目。
解密函数是 D(x)=a−1(x−b)(modm)
,其中 a−1 是 a 在 Zm
群的乘法逆元。
下面我们以 E(x)=(5x+8)mod26
函数为例子进行介绍,加密字符串为 AFFINE CIPHER
,这里我们直接采用字母表26个字母作为编码系统
其对应的加密结果是 IHHWVCSWFRCP
。
对于解密过程,正常解密者具有a与b,可以计算得到 a−1为 21,
所以其解密函数是D(x)=21(x−8)(mod26)
,解密如下
可以看出其特点在于只有 26 个英文字母。
破解
首先,我们可以看到的是,仿射密码对于任意两个不同的字母,其最后得到的密文必然不一样,所以其也具有最通用的特点。当密文长度足够长时,我们可以使用频率分析的方法来解决。
其次,我们可以考虑如何攻击该密码。可以看出当a=1
时,仿射加密是凯撒加密。而一般来说,我们利用仿射密码时,其字符集都用的是字母表,一般只有26个字母,而不大于26的与26互素的个数一共有
ϕ(26)=ϕ(2)×ϕ(13)=12
算上b的偏移可能,一共有可能的密钥空间大小也就是
12×26=312
一般来说,对于该种密码,我们至少得是在已知部分明文的情况下才可以攻击。下面进行简单的分析。
这种密码由两种参数来控制,如果我们知道其中任意一个参数,那我们便可以很容易地快速枚举另外一个参数得到答案。
但是,假设我们已经知道采用的字母集,这里假设为26个字母,我们还有另外一种解密方式,我们只需要知道两个加密后的字母 y1,y2
即可进行解密。那么我们还可以知道
y1=(ax1+b)(mod26)y2=(ax2+b)(mod26)
两式相减,可得
y1−y2=a(x1−x2)(mod26)
这里 y1,y2
已知,如果我们知道密文对应的两个不一样的字符 x1 与 x2 ,那么我们就可以很容易得到 a ,进而就可以得到 b 了。
例子
这里我们以TWCTF 2016 的 super_express为例进行介绍。简单看一下给的源码
import sys
key = '****CENSORED***************'
flag = 'TWCTF{*******CENSORED********}'
if len(key) % 2 == 1:
print("Key Length Error")
sys.exit(1)
n = len(key) / 2
encrypted = ''
for c in flag:
c= ord(c)
for a, b in zip(key[0:n], key[n:2*n]):
c = (ord(a) * c + ord(b)) % 251
encrypted += '%02x' % c
print encrypted
可以发现,虽然对于 flag 中的每个字母都加密了 n 次,如果我们仔细分析的话,我们可以发现
c1=a1c+b1c2=a2c1+b2=a1a2c+a2b1c+b2=kc+d
根据第二行的推导,我们可以得到其实 cn
也是这样的形式,可以看成 cn=xc+y
,并且,我们可以知道的是,key 是始终不变化的,所以说,其实这个就是仿射密码。
此外,题目中还给出了密文以及部分部分密文对应的明文,那么我们就很容易利用已知明文攻击的方法来攻击了,利用代码如
import gmpy
key = '****CENSORED****************'
flag = 'TWCTF{*******CENSORED********}'
f= open('encrypted', 'r')
data = f.read().strip('n')
encrypted = [int(data[i:i + 2], 16) for i in range(0, len(data), 2)]
plaindelta = ord(flag[1]) - ord(flag[0])
cipherdalte = encrypted[1] - encrypted[0]
a= gmpy.invert(plaindelta, 251) * cipherdalte % 251
b= (encrypted[0] - a * ord(flag[0])) % 251
a_inv = gmpy.invert(a, 251)
result = ""
for c in encrypted:
result += chr((c - b) * a_inv % 251)
print result
结果如下:
➜ TWCTF2016-super_express git:(master) ✗ python exploit.py
TWCTF{Faster_Than_Shinkansen!}
杂项第五题: 远控木马
某次应急响应时,工程师发现一个远控木马的客户端程序,请分析该远程控制木马的控制端IP及端口号。
在虚拟机上运行netstat -ano
查看
杂项第六题: Web漏洞
黑客利用漏洞从Web系统中窃取了什么机密信息?
日志读取
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import urllib
import re
flag = ''
flag_list = []
with open('access.log', 'r') as file:
#print file.read()
line_lists = file.readlines()
#print len(line_lists)
flag_lines = []
for i in line_lists:
if 'flag' in i:
flag_lines.append(i)
#print len(flag_lines)
for i in flag_lines:
s = i.split(" ")[6]
s=urllib.unquote(s)
if '!=' in s :
print s
p = re.compile(r'!=[1-9]d*')
flag = flag +chr(int(p.findall(s)[0].replace('!=','')))
print flag
bugku-ctf 第七题:颜文字
(ノ`Д)ノ
本文始发于微信公众号(LemonSec):【杂项入门-颜文字】
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论