打了好几天最后也只是80多名,我好菜啊.jpg
0x00 (╯°□°)╯︵ ┻━┻
题目:
(╯°□°)╯︵ ┻━┻
d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd
一开始被这个(╯°□°)╯︵ ┻━┻误导以为是jjencode,尝试了好久没啥结果,后面又有人说是翻转,试了很久还是没结果。然后跑了下移位密码获取flag
贴上脚本
1 s='d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd' 2 ''' 3 s1='' 4 for x in range(len(s)/2): 5 s1+=chr((int(s[x*2:x*2+2],16))%128) 6 print s1 7 ''' 8 9 for j in range(20): 10 s1='' 11 for x in range(len(s)/2): 12 s1+=chr((int(s[x*2:x*2+2],16)-j)%128) 13 print s1 14
0x01 第四扩展FS
题目:D公司正在调查一起内部数据泄露事件,锁定嫌疑人小明,取证人员从小明手机中获取了一张图片引起了怀疑。这是一道送分题,提示已经在题目里,日常违规审计中频次有时候非常重要。 https://pan.baidu.com/s/1DJpMFU2lajHGTo0yfzTHVQ 密码:fpp4
这道题很多坑,拿到题目看题目名字就可以知道它考的是ext4文件,先用压缩软件打开查看了一下
因为没怎么接触过ext4文件系统所以不知道journal文件是拿来干嘛的,百度后说是文件系统日志,所以考虑mount到linux上,但是怎么都不成功。
另外还有一个加密的file.txt,用binwalk扫了下文件,发觉就是这两个文件
为了寻找file.txt密码,用winhex打开jpg后发现有些图片有敏感信息,然后直接查看图片属性,发现解压密码
根据提示频率,统计一下字符出现频率,贴上脚本,得到flag
1 import collections 2 3 f=open('file.txt','r') 4 print collections.Counter(f.read())
0x02 流量分析
题目:提示一:若感觉在中间某个容易出错的步骤,若有需要检验是否正确时,可以比较MD5: 90c490781f9c320cd1ba671fcb112d1c
提示二:注意补齐私钥格式
-----BEGIN RSA PRIVATE KEY-----
XXXXXXX
-----END RSA PRIVATE KEY-----
这题给的数据包很大,而且有很多坑,数据包前面有两个用ftp传输加密压缩文件fl-g.zip,sqlmap-dev.zip,中间有九封邮件,只到看到最后才会发现本题关键ssl加密通信。
前面的两个压缩包可能是本题彩蛋,不过我是真的解不出来。。。所以跳过,直接导出邮件。
将导出的邮件导入qq邮箱中查看,可以发现这个
这里是本题关键,在数据包中这里是很大一串base64,解密后得到rsa私钥
,将私钥识别补齐格式进行ssl解密得到
0x03 安全通信
题目:请通过nc XXXX.XXXX.XXXX.XXXX XXXX
答题,mission key
是b9ba15b341c847c8beba85273f9b7f90
,agent id
随意填就可以
1 #!/usr/bin/env python 2 import sys 3 import json 4 from Crypto.Cipher import AES 5 from Crypto import Random 6 7 8 def get_padding(rawstr): 9 remainder = len(rawstr) % 16 10 if remainder != 0: 11 return '\x00' * (16 - remainder) 12 return '' 13 14 15 def aes_encrypt(key, plaintext): 16 plaintext += get_padding(plaintext) 17 aes = AES.new(key, AES.MODE_ECB) 18 cipher_text = aes.encrypt(plaintext).encode('hex') 19 return cipher_text 20 21 22 def generate_hello(key, name, flag): 23 message = "Connection for mission: {}, your mission's flag is: {}".format(name, flag) 24 return aes_encrypt(key, message) 25 26 27 def get_input(): 28 return raw_input() 29 30 31 def print_output(message): 32 print(message) 33 sys.stdout.flush() 34 35 36 def handle(): 37 print_output("Please enter mission key:") 38 mission_key = get_input().rstrip() 39 40 print_output("Please enter your Agent ID to secure communications:") 41 agentid = get_input().rstrip() 42 rnd = Random.new() 43 session_key = rnd.read(16) 44 45 flag = '' 46 print_output(generate_hello(session_key, agentid, flag)) 47 while True: 48 print_output("Please send some messages to be encrypted, 'quit' to exit:") 49 msg = get_input().rstrip() 50 if msg == 'quit': 51 print_output("Bye!") 52 break 53 enc = aes_encrypt(session_key, msg) 54 print_output(enc) 55 56 57 if __name__ == "__main__": 58 handle()
分析代码得知,该题为aes ecb加密,这几天密码学课刚好讲到这,ecb是一种非常不安全的加密,wiki上有很好的举例。脚本放后面了。
1.本题通过输入agent_id,构造形如
Connection for mission: {agent_id}, your mission's flag is: DDCTF{32位}的字符串,
用随机生成的16位密钥进行加密,在一次连接中密钥不会变换
2.因为aes的特性通过改变输入agent_id长度,可以确定flag长度为32位,如下图
3.因为aes特性将字符串16位一组分组,当输入12345678时,字符串多出一位},分析脚本得知会用0补齐。
4.aes_ecb的特性,最后一组的}和单独输入}加密后一样,得知可以进行爆破,通过改变agent_id长度进行爆破。得到flag
1 #coding=utf-8 2 import socket 3 import string 4 mission_key = '''xxxxxxxxxxxxxxxxxxxxxxxxxxxxx''' 5 a='''1234567890123456789012345678901234567890'''#最初的agent_id 6 flag='DDCTF{' 7 msg="flag is: DDCTF{" 8 for x in range(1,33):#长度32位 9 agent=a[:40-x]+'\n'#每次变换agent 10 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 11 s.connect(('116.85.48.103',5002)) 12 s.recv(1024) 13 s.send(mission_key+'\n') 14 s.recv(1024) 15 s.send(agent) 16 c=s.recv(1024).rstrip() 17 for i in string.printable: 18 s.recv(1024) 19 s.send(msg+i+'\n') 20 ss=s.recv(1024).rstrip()[:32] 21 if(ss==c[160:192]): 22 msg=msg[1:]+i 23 flag+=i 24 print flag 25 break 26 s.close() 27 print flag+'}'
0x04 complex stego
题目:
不算提示的提示3:这道题一共有两个解法,之前只提示了一种,另外一种比较简单
不算提示的提示2:https://www.bilibili.com/video/av19141078
https://www.bilibili.com/video/av21411551
P.S. 出题时间在出视频时间之前,从这个意义上说跟题目没有关系,因此这是不算提示的提示
提示:请善用搜索引擎来学习,重点是z
=====
警方正在利用某黑客使用过的设备,来追查其行踪,并发现了下面附件中的文件。
该黑客利用附件中的encrypt.py,将其密钥转换成encrypted.bmp保存。警方在测试时,发现利用encrypt.py字符串“DDCTF{}”能被转换成下图的美丽图样。
你能帮助警方从encrypted.bmp恢复出该黑客的密钥么?(为便于修正误差,本题flag后面重复出现了一次flag本体)
题解:根据两张图片和一些我自定义的字符串进行加密,得到字符串长7位时每种颜色出现6次,8位时出现7次,数出加密图片颜色次数位37次可以确定加密的字符串长38位。根据题意flag本体重复了一次所以加密字符串格式为DDCTF{15位} 15位,还有一位一直不知道是啥,现在知道是空格了
直接引用出题人的解答吧,毕竟我连傅里叶变换都没学过。只知道解题脚本是用那个微分方程写出来的。
https://github.com/garzon/DDCTF_2018/tree/master/complex_stego
贴一下出题人的解题脚本
1 from PIL import Image 2 import cmath, math, random, string 3 4 maxLen = 45 5 img_size = 800 6 abs_cor_size = 1.05 7 maxValue = 2200.0 8 9 def linear_map(v, old_dbound, old_ubound, new_dbound, new_ubound): 10 return (v-old_dbound)*1.0/(old_ubound-old_dbound)*(new_ubound-new_dbound) + new_dbound 11 12 def read_from_img(img): 13 def mapping(r, i): 14 x = int(round(linear_map(r, -abs_cor_size, abs_cor_size, 0, img_size))) 15 y = int(round(linear_map(i, -abs_cor_size, abs_cor_size, img_size, 0))) 16 return (x, y) 17 def X(z): 18 pix_pos = mapping(z.real, z.imag) 19 t = img.getpixel(pix_pos) 20 return complex(linear_map(t[1], 0, 255, -maxValue, maxValue), linear_map(t[2], 0, 255, -maxValue, maxValue)) 21 return X 22 23 def z_decrypt(X): 24 real_max_val = 0.0 25 decrypted = [] 26 for n in xrange(maxLen): 27 res = 0.0 28 dw = 0.001 29 w = -math.pi 30 while w < math.pi: 31 v = X(pow(math.e, 1j * w)) 32 if v.real > real_max_val: real_max_val = v.real 33 if v.imag > real_max_val: real_max_val = v.imag 34 res += v * pow(math.e, 1j * w * n) * dw 35 w += dw 36 decrypted.append(res/math.pi/2) 37 print 'realmax', real_max_val 38 err = [math.fabs(j.imag) for j in decrypted] 39 res = ''.join([string.printable[j-1] if j <= len(string.printable) and j >= 1 else '?' for i in decrypted for j in [int(round(i.real))]]).strip('?') 40 return res 41 42 img = Image.open('encrypted.bmp') 43 X = read_from_img(img) 44 decrypted = z_decrypt(X) 45 print len(decrypted), decrypted 46 print '--------- decrypted! ----------------'