首页 > 其他分享 >ctfshow刷题记录-cry方向-1

ctfshow刷题记录-cry方向-1

时间:2024-03-04 09:14:35浏览次数:29  
标签:base64 string temp cry list len ctfshow fina 刷题

0x00

题目来源:ctfshow 菜狗杯 crypto方向 base47
题目描述:
神必字符: E9CVT+HT5#X36RF4@LAU703+F$E-0N$@68LMXCVDRJJD5@MP#7MUZDTE?WWLG1S#L@+66H@59KTWYK8TW0RV
神必字典:
0123456789ABCDEFGHJKLMNPQRSTUVWXYZ?!@#$%^&*-+

0x01

第一次做这种base换表的题目,在网上查了查相关wp,感觉自己对base家族还不太熟悉,于是自己先用py写了个base64的加解密的脚本,代码如下:

string1 = "E9CV^T+HT5#X36RF4@LAU703+F$E-0N$@68LMXCVDRJJD5@MP#7MUZDTE?WWLG1S#L@+^66H@59KTWYK8TW0RV"
test_string = "abc123"
dict1 = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ?!@#$%^&*-+"


def base64_encode(test_string):
    dict2 = ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")# base64表
    temp_string = str()
    for i in test_string:  # 字符->二进制ascii码, 放到temp_string里
        temp_string += bin(ord(i))[2:].zfill(8)
    temp_list = list() 
    if len(test_string) % 3 == 1:
        temp_string += "0000"
    if len(test_string) % 3 == 2:
        temp_string += "00"
    while temp_string!='':
        temp_list.append(temp_string[0:6])
        temp_string=temp_string[6:]
    fina_list = list()  # 以这些6位的二进制数值查找base表,存到fina_list中
    for i in range(0, len(temp_list)):
        fina_list.append(dict2[int(temp_list[i], 2)])
    fina_string = str()
    for i in fina_list:  # 转化成字符串fina_string
        fina_string +=  i
    if len(test_string) % 3 == 1:
        fina_string += "=="
    if len(test_string) % 3 == 2:
        fina_string += "="
    return fina_string

'''print("asfaegqfa123:", base64_encode("asfaegqfa123"), "YXNmYWVncWZhMTIz"==base64_encode("asfaegqfa123"))
print("asfaegqfa12:", base64_encode("asfaegqfa12"), "YXNmYWVncWZhMTI="==base64_encode("asfaegqfa12"))
print("asfaegqfa1231:", base64_encode("asfaegqfa1231"), "YXNmYWVncWZhMTIzMQ=="==base64_encode("asfaegqfa1231"))'''


def base64_decode(string):
    #dict2 = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ?!@#$%^&*-+"
    dict2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    list2 = list(dict2)
    temp_string=str()
    if string[-1] == "=" and string[-2] == "=":
        string = string[0 : len(string) - 2]
    if string[-1] == "=" and string[-2] != "=":
        string = string[0 : len(string) - 1]
    for i in string:  # 字符转二进制码
        temp_string+=str(bin(list2.index(i))[2:].zfill(6))
    length=len(temp_string)
    if length%8==2:
        temp_string=temp_string[0:length-2]
    if length%8==4:
        temp_string=temp_string[0:length-4]
    fina_list=list()
    while temp_string!='':   #每八位分一组  放入fina_list中
        fina_list.append(temp_string[0:8])
        temp_string=temp_string[8:] 
    fina_string=str()
    for i in fina_list:
        fina_string+=chr(int(i,2))
    return fina_string

'''print("asfaegqfa123"==base64_decode("YXNmYWVncWZhMTIz"))
print("asfaegqfa12" == base64_decode("YXNmYWVncWZhMTI="))
print("asfaegqfa1231"==base64_decode(""))'''
`

后来问了问王师傅,基本理解了base的本质其实就是进制转换,每个字符串都对应一串256进制的数字(一个字符都是8bit,用ascii解码方式) 回过头来看题目,这个其实就是base45加密的字符串,思路应该是密文中每个字符对应字典的下标这一串数字是len(字典)进制的,先转成10进制,再转ascii码字符串即可,脚本代码如下:

import libnum
cipher = "E9CV^T+HT5#X36RF4@LAU703+F$E-0N$@68LMXCVDRJJD5@MP#7MUZDTE?WWLG1S#L@+^66H@59KTWYK8TW0RV" 
key = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ?!@#$%^&*-+"
sum=0
for i in range(len(cipher)):
    sum+=key.index(cipher[i])*pow(len(key),len(cipher)-1-i)
flag=libnum.n2s(sum)
print(flag)

0x02

由这道题引发的思考,可不可以做一个base任意数字的编码,由上述原理写出了一个basexx加解密的脚本,代码如下:

import libnum
def base_xx_decode(cipher):
    # key为任意映射表 
    # key = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ?!@#$%^&*-+"  
    key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"  #base64表
    sum = 0
    for i in range(len(cipher)):
        sum += key.index(cipher[i]) * pow(len(key), len(cipher) - 1 - i)  #len(key)进制转10进制
    flag = libnum.n2s(sum)    #ascii值转字符串
    return flag
print(base_xx_decode("YWJjMTIz"))       # just an example  =='abc123'

def base_xx_encode(plaintext):
    key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    beichushu = libnum.s2n(plaintext)
    cipher=str()
    chushu = len(key)   #给chushu yushu shang beichushu赋初值  然后辗转相除法进行10进制转len(key)进制,并直接映射到cipher里
    yushu = beichushu % chushu
    shang = beichushu // chushu
    beichushu = shang
    cipher += key[yushu]
    while shang != 0:
        yushu = beichushu % chushu
        shang = beichushu // chushu
        beichushu = shang
        cipher += key[yushu]
    cipher=cipher[::-1]
    return cipher
print(base_xx_encode("abc123"))  # just an example   =='YWJjMTIz' 

这个脚本只能加解密无填充规则且ascii编码的那种,比如base64就是无“=”

标签:base64,string,temp,cry,list,len,ctfshow,fina,刷题
From: https://www.cnblogs.com/y1nh3/p/18046754

相关文章

  • 牛客大厂真题刷题记录
    1、问题:统计在有用户互动的最近一个月(按包含当天在内的近30天算,比如10月31日的近30天为10.2~10.31之间的数据)中,每类视频的转发量和转发率(保留3位小数)。注:转发率=转发量÷播放量。结果按转发率降序排序。selecttag,sum(if_retweet)retweet_cut,round(sum(if_retweet)/coun......
  • CRYPTO入门
    月月的爱情故事txt.txt提示txt,把后缀改成txt,得到文本看到加密文本,丢去解密得到如下U2FsdGVkX1/bVF45zytlkeEhefAqkpHQdMqtULk2OibLq79NHJMm9rP3CtkKrE41CaBJmMIVcUVSb3IzpHeuWw==一眼看上去像Rabbit1.特点:Rabbit加密开头部分通常为U2FsdGVkX1(AES、DES、RC4、Rabbit......
  • Python模块之 Crypto 实现加密与解密
    模块作用简介:Python模块之Crypto实现加密与解密官方英文帮助:https://docs.python.org/3/library/官方简体中文帮助:https://docs.python.org/zh-cn/3/library/必要操作:>>>importCrypto安装:>>>pipinstallpycryptodome导入包:>>>fromCrypto.Cipher......
  • from Crypto.Util.Padding import pad,unpad 报错,没有找到依赖
    1、安装pipinstallpycryptodomepipinstallCrypto2、安装完成后重启idea,发现还是没有打开依赖包所在的文件夹:安装位置\Lib\site-packages发现Crypto是小写,将代码中的引入改成小写fromcrypto.Util.Paddingimportpad,unpad 3、打开crypto文件夹,看到Util和Ciph......
  • Leetcode刷题第十五天-链表
    203:移除链表元素链接:203.移除链表元素-力扣(LeetCode)#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defremoveElements(self,head:Op......
  • 机试刷题
    机试刷题记录一、刷题L1-007念数字题目链接:https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805136889593856?type=7&page=0错误答案:#include<stdio.h>#include<math.h>intx,y;charstr[10][5]={"ling","yi","er",......
  • CrystalDiskMark使用说明
    CrystalDiskMark使用说明CrystalDiskMark(CDM)是一个用于评估硬盘和固态硬盘性能的流行工具。它是由CrystalDewWorld公司开发的,是一款免费的磁盘性能测试实用程序。CrystalDiskMark提供了一个直观的界面,使用户能够轻松地测试磁盘的读写速度,并获取详细的性能数据。官方网站地......
  • ctfshow sql注入练习记录
    前言:继续做ctfshow的题了,本次为sql注入专题,从ctfshowweb177开始ctfshowweb177对空格,--+进行了过滤,注释符要换成#的url编码%23使用万能密码可以绕过1'or'1'='1';%23也可也使用/**/对空格进行绕过,进行联合查询-1'union/**/select/**/1,2,password/**/from/**/ctfshow_use......
  • C++ 刷题必备
    目录语言必备语言必备在C++中刷Leetcode时,有一些常用的语言技巧和最佳实践可以帮助你更有效地解决问题。以下是一些建议:熟悉STL(StandardTemplateLibrary):使用vector,list,set,map等容器来存储和操作数据。使用algorithm库中的函数,如sort,binary_search,unique等。......
  • Leetcode刷题第十四天-动态规划
    674:最长连续递增序列链接:674.最长连续递增序列-力扣(LeetCode)1classSolution:2deffindLengthOfLCIS(self,nums:List[int])->int:3n=len(nums)4dp=[1]*n5if(n<1):return06foriinrange(1,n):7if......