XCTF asong

说实话 这个题 还是比较难受的 

当我看到  有三个文件的时候  我有点慌   感觉又是什么玩意的时候 

但是仔细分析了一下  感觉这个题 还有点好玩

一个是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 <stdio.h>
#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<iostream>
#include<map>
#include<time.h>
#include<queue>
#include <Windows.h>
#include "windows.h"
using namespace std;
map<int,int>mapps;
map<int,char>ma;
int vable[25]={' ', '\'', '_', 'a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'm', 'l', 'o', 'n', 'p', 's', 'r', 'u', 't', 'w', 'v', 'y'};
int key[25]={71, 40, 245, 104, 15, 30, 169, 29, 38, 19, 60, 67, 20, 28, 39, 165, 118, 26, 51, 61, 45, 133, 34, 7, 62};
int mapp[38]={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};
int l[38]={0xec,0x29,0xe3,0x41,0xe1,0xf7,0xaa,0x1d,0x29,0xed,0x29,0x99,0x39,0xf3,0xb7,0xa9,0xe7,0xac,0x2b,0xb7,0xab,0x40,0x9f,0xa9,0x31,0x35,0x2c,0x29,0xef,0xa8,0x3d,0x4b,0xb0,0xe9,0xe1,0x68,0x7b,0x41};
int main()
{
    for(int i=0;i<25;i++)
    {
        ma[key[i]]=vable[i];
    }
    for(int i=0;i<38;i++)
    {
        mapps[mapp[i]]=i;
    }
    int s[38];
    int temp=s[37]&0x7;
    for(int i=0;i<38;i++)
    {
        s[i]=(temp<<5)|(l[i]>>3);
        temp=l[i]&0x7;
    }
    int j=37;
    temp=s[j];
    while(mapps[j]!=37)
    {
        s[j]=s[mapps[j]];
        j=mapps[j];
    }
    s[j] = temp;
    for(int i=0;i<38;i++)
    {
        printf("%c",ma[s[i]]);
    }
    return 0;
}

然后 官方给的是  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())

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值