说实话 这个题 还是比较难受的
当我看到 有三个文件的时候 我有点慌 感觉又是什么玩意的时候
但是仔细分析了一下 感觉这个题 还有点好玩
一个是elf 文件 一个是 文本文件 一个是out out 里面是需要我们解密的数据
然后 我们先分析一下elf
这里没有什么好说的我们 get_file_thatgirl_index 这个函数其实就是存的频率
0 -9 下标是0-9 小写大写的下标都一样
然后 我们看一下下面的函数
这里就很重要了 如果get不到 v5的值 那么我们就没有办法 进行下一步了 重点 就是 a2 的值哪里来的
这里我跑了一个脚本 模仿了 get_file_thatgirl_index 这个函数
#!/usr/bin/python3
#coding=utf8
if __name__ =='__main__':
f=open("that_girl")
l=[]
for line in f:
for i in line:
if ord(i)>=ord('A') and ord(i)<=ord('Z'):
l.extend(chr(ord(i)+32))
else:
l.extend(i)
summ={}
while '\n' in l:
l.remove('\n')
for ch in l:
if(ch not in summ):
summ[ch]=0
summ[ch]+=1
print(summ)
data={}
data=sorted(summ.items(),key=lambda x:x[0])
print(data)
f.close()
然后 用 dbg 调试了一下 发现这两个相同 那么就很好解释了
其实这里就是 得出的 输入字符 对应 那个文件的 频率 假如 你输入的 T 而 文件出现了133 次 那么就代表了 v5[0]是133
OK 那么我们往下看
emmmm 两个加密 我们解密一下就好了
然后这里是我们C语言实现的代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
然后 官方给的是 python代码 很简洁。。https://www.xctf.org.cn/library/details/8723e039db0164e2f7345a12d2edd2a5e800adf7/
#!/usr/bin/python3
# -*- coding:utf-8 -*-
s = [22, 0, 6, 2, 30, 24, 9, 1, 21, 7, 18, 10, 8, 12, 17, 23, 13, 4, 3, 14, 19, 11, 20, 16, 15, 5, 25, 36, 27, 28, 29, 37, 31, 32, 33, 26, 34, 35]
mapp={' ': 71, "'": 40, '_': 245, 'a': 104, 'c': 15, 'b': 30, 'e': 169, 'd': 29, 'g': 38, 'f': 19, 'i': 60, 'h': 67, 'k': 20, 'm': 28, 'l': 39, 'o': 165, 'n': 118, 'p': 26, 's': 51, 'r': 61, 'u': 45, 't': 133, 'w': 34, 'v': 7, 'y': 62}
def decypt():
enc = open("out","rb").read()
d0 = []
temp = ord(enc[len(enc)-1]) & 0x7
for i in range(len(enc)):
d0.append((temp << 5) | (ord(enc[i]) >> 3))
temp = ord(enc[i]) & 0x7
i = 37
temp = d0[37]
while s.index(i) != 37:
d0[i] = d0[s.index(i)]
i = s.index(i)
d0[i] = temp
flag = []
for i in d0:
flag.append(list(mapp.keys())[list(mapp.values()).index(i)])
return "QCTF{%s}" % ''.join(flag)
print(decypt())