ctfshow刷题记录-cry方向-1

这篇具有很好参考价值的文章主要介绍了ctfshow刷题记录-cry方向-1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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就是无“=”文章来源地址https://www.toymoban.com/news/detail-837677.html

到了这里,关于ctfshow刷题记录-cry方向-1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Web】CTFSHOW PHP文件包含刷题记录(全)

    温故知新。 目录 web78 web79 web80 web81 web82 web83 web84 web85 web86 web87 web88 伪协议base64编码直接读出文件内容就行 一眼data伪协议包含php脚本 data也被禁了,日志包含即可 多禁了一个\\\":\\\",还是可以日志包含 连\\\".\\\"都被禁用了,/tmp/sess_xxx是不带点的,尝试多线程条件竞争包含临时目录下

    2024年02月02日
    浏览(47)
  • 【Web】CTFSHOW java反序列化刷题记录(部分)

    目录 web846 web847 web848 web849 web850 web856 web857 web858 直接拿URLDNS链子打就行 payload: 也可直接用ysoserial 有关CC链:CC链 1-7 分析 - 先知社区 题目提示: 用CC1打就行 先生成反弹shell的payload: 生成的payload放bp自带的decoder里进行一次url全编码 get方式传参 监听,成功反弹shell TransformedMap也

    2024年02月20日
    浏览(44)
  • 【刷题记录】stack queue的题目练习

    题目链接: 155. 最小栈 - 力扣(LeetCode) 题干: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int get

    2024年02月01日
    浏览(41)
  • 【剑指offer刷题记录 java版】数组双指针 之 其它题目

    本系列文章记录labuladong的算法小抄中剑指offer题目 题目链接:https://leetcode.cn/problems/XltzEq/ 题目链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/ 题目链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/ 题目链接:https://leetcode.cn/problems/he-wei-sde-

    2024年02月11日
    浏览(48)
  • 小白刷题CTF show web方向

    右键查看源代码,再使用在线解密,就可以得出答案了 admin\\\' or 1=1 或者 1 or 1=1 可以登录 查询几个字段: 1\\\' or 1=1 order by 3 # 使用此语句,判断列数。 order by 3不会出错,但是order by 4就没有显示了,因此判断共有3列。 ORDER BY 子句中的数字(如 ORDER BY 4)通常表示 按照查询结果中

    2024年03月14日
    浏览(34)
  • 华为海思校园招聘-芯片-数字 IC 方向 题目分享——第九套

    单选 1.以下低功耗措施中,哪种不是降低电路翻转率的方法? A.在不进行算术运算的时候,使这些模块的输入保持不变,不让新的操作数进来 B.采用 Gray 码或 One‐hot 码作为状态机编码 C.减少电路中的 glitch D.重新安排“if‐else”表达试,可将毛刺或快变化信号移至逻辑锥体的

    2024年04月12日
    浏览(44)
  • 华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套

    华为海思校园招聘-芯片-数字 IC 方向 (第六套) 1、影响芯片成本的主要因素是  Die Size  和封装,但电源、时钟等因素,特别是功耗对解决 方案的成本影响较大,因此低成本设计需要兼顾低功耗设计:() A.  错误 B.  正确 解析: 题目里已经说明了,“影响芯片成本的主

    2024年04月28日
    浏览(49)
  • 【刷题笔记8.10】LeetCode题目:有效括号

    给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号 首先,解决此题,我们要明确使用 栈

    2024年02月13日
    浏览(37)
  • 【刷题笔记8.8】LeetCode题目:两数之和

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是, 数组中同一个元素在答案里不能重复出现 。 你可以按任意顺序返回答案。 解法1:使用HashMap对数

    2024年02月13日
    浏览(42)
  • 【刷题】带你愉快地走出刷简单题目感到吃力的窘境

    在刷题的过程中,你是否也有过这样的经历:一看题型很简单、很眼熟,但真正去做的时候却怎么也做不出来,心急如焚。感觉自己在平时也没少下功夫、没少刷题,怎么还是出现了“一支笔,一双手,一道力扣(Leetcode)做一宿”的窘境?看完今天的文章,希望你可以从目

    2024年02月15日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包