bugku 密码题笔记

一、散乱的密文

lf5{ag024c483549d7fd@@1}
一张纸条上凌乱的写着2 1 6 5 3 4

这么一看觉得可能就是每6个一组,然后每组按照给出的提示重排字母。但是前面6个按给出的顺序排就是
flga5{
好像不对,但先试试吧,题目都这么说了呢:
写代码令我头大。。。

import re
string='lf5{ag024c483549d7fd@@1}'
a=list(re.findall(r'.{6}',string))
for i in range(4):
    p=a[i]
    #s=p[1]+p[0]+p[4]+p[5]+p[3]+p[2]
    s=p[1]+p[0]+p[5]+p[4]+p[2]+p[3]
    print(s,end='')

得出结果:
flga5{20844c537d49df}1@@
嗯。果然不对。不是正确答案,再都换个位置吧,除了前两个,后面的都两两互换一下。

text="flga5{20844c537d49df}1@@"
text=list(text)
c=list([x for x in list(range(2,25)) if x%2 == 0])
d=list([x for x in list(range(2,25)) if x%2 != 0])
p=''
for i in range(len(c)):
    p+=text[d[i]]+text[c[i]]
    print(p)

勉强能得出想要的结果,但程序会报错:
list index out of range,索引超出了范围。头大。。。
flag{50248c435d794fd1}@@,去掉后面两个@@就是正确答案啦。
之后发现如果将前六个的排列顺序直接按照flag{5的顺序排,也就是第一段代码注释掉的那个部分,得出的答案直接就是正确的。。。。。。
果然还是太年轻。这个弯弯绕绕的时代,为什么题目都不可以诚实且正直呢??

二、托马斯杰弗逊

1: <ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: <KPBELNACZDTRXMJQOYHGVSFUWI <
3: <BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: <RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: <IHFRLABEUOTSGJVDKCPMNZQWXY <
6: <AMKGHIWPNYCJBFZDRUSLOQXVET <
7: <GWTHSPYBXIZULVKMRAFDCEONJQ <
8: <NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: <QWATDSRFHENYVUBMCOIKZGJXPL <
10: <WABMCXPLTDSRJQZGOIKFHENYVU <
11: <XPLTDAOIKFZGHENYSRUBMCQWVJ <
12: <TDSWAYXPLVUBOIKZGJRFHENMCQ <
13: <BMCSRFHLTDENQWAOXPYVUIKZGJ <
14: <XPHKZGJTDSENYVUBMLAOIRFCQW <
密钥: 2,5,1,3,6,4,9,7,8,14,10,13,11,12
密文:HCBTSXWCRQGLES
flag格式 flag{你解密的内容}

第一眼看过去,这不就是流密码吗,每个密钥产生一条密钥流,明文中的每个字符都只用一条密钥流来加密,解密也是一样,一个字符对应一条密钥流来解。那解密方式是什么呢?看了眼题干,托马斯杰弗逊。
查了资料后发现这题是转轮机啊,还是对基础知识不熟悉。。
知道解法后就好办了,就是把密文中的字符在密钥流中的位置转到最前面。
先把整个密钥流顺序按给出的密钥排好。然后:

f=open("1.txt","r")
f=f.read()
f=list(f.split( ))
miwen="HCBTSXWCRQGLES"
str=""
for i in range(14):#每行
    for j in range(26):#行中的每个元素
        if f[i][j] == miwen[i]:
            str=f[i][j:]+f[i][:j]
            print(str)

将结果复制到文本,进行下一步。
排好后再读取每一列:

f=open("2.txt","r")     
f=f.read()
f=list(f.split( ))
for i in range(26):
    str=""
    for j in range(14):
        str+=f[j][i]
    print(str)

得出结果:
在这里插入图片描述
要很努力且眼睛不错的朋友才能看见这个似乎挨点边。

a="XSXSBUGKUADMIN"
a.lower()

成功。
三、告诉你个秘密

636A56355279427363446C4A49454A7154534230526D6843
56445A31614342354E326C4B4946467A5769426961453067

这个题看了writeup之后才做出来,很新奇,前面一部分的解码没什么问题,用一个converter的小软件一通乱摁
先是hex to text

cjV5RyBscDlJIEJqTSB0RmhCVDZ1aCB5N2lKIFFzWiBiaE0g

再是base64 to text

r5yG lp9I BjM tFhBT6uh y7iJ QsZ bhM

到这里就很神奇了,居然是按键盘上的排列,如r5yg这四个键包围着t,lp9i这四个键包含着o,bjm是n……

TONGYUAN

正确答案前没有flag 并且是大写。

四、进制转换

二进制、八进制、十进制、十六进制,你能分的清吗?
在这里插入图片描述
打开是个txt文件,根据提示应该是把里面散落的各种不同进制的数字都转化成字符串。(这是一个超链接)
python:

  • 十六进制转字符串
    chr(int(‘0x66’,16))
  • 二进制转字符串
    chr(int(‘0b1100101’,2))
  • 八进制转字符串
    chr(int(‘0o70’, 8))
  • 十进制转字符串
    chr(‘87’)

按照以上规则要对题目文件做一点小小修改,把所有的空格b,空格x,空格o变成0b,0x,0o。代表十进制的d全删掉,在空格的地方在补上双引号以表示这是个字符串形式,因为int函数内参数要求为字符串。


import re
f=["87","0x65","0x6c","0x63","0o157","109","0o145","0b100000","116","0b1101111","0o40","0x6b","0b1100101","0b1101100","0o141","105","0x62","101","0b1101001","46","0o40","71","0x69","118","0x65","0x20","0b1111001","0o157","0b1110101","32","0o141","32","102","0o154","0x61","0x67","0b100000","0o141","115","0b100000","0b1100001","32","0x67","0o151","0x66","116","0b101110","0b100000","32","102","108","97","0o147","123","0x31","0b1100101","0b110100","98","102","0b111000","49","0b1100001","54","0b110011","0x39","0o64","0o144","0o145","53","0x61","0b1100010","0b1100011","0o60","48","0o65","0b1100001","0x63","0b110110","101","0o63","0b111001","97","51","0o70","55","0b1100010","125","0x20","0b101110","0x20","0b1001000","97","118","0o145","0x20","97","0o40","103","111","111","0x64","32","0o164","0b1101001","0x6d","0o145","0x7e"]
p2='^0b\d.*'#匹配开头是0b的二进制字符
p8='^0o\d.*'
p16='^0x\d.*[a-zA-Z0-9]'#十六进制0x后接不仅是数字,还有abcde等字母
p10='[1-9]\d.*'#纯数字,十进制不会以0开头,避免和0x65这种数字混淆。
res=''
for i in f:
    if re.match(p2,i):
        res+=chr(int(i,2))
    if re.match(p8,i):
        res+=chr(int(i,8))
    if re.match(p16,i):
        res+=chr(int(i,16))
    if re.match(p10,i):
        res+=chr(int(i,10))
print(res)

最后得出结果

Welcome to kelaibei. Give you a flag as a gift. flag{1e4bf81a6394de5abc005ac6e39a387b} . Have a good time~

成功得到flag,对于正则表达式太不熟练。本来很简单,搞了蛮久都错了。
在这可以测试正则表达式

五、affine
y = 17x-8 flag{szzyfimhyzd}
答案格式:flag{*}
这题我乍一看以为就是把flag括号里的字符转化成ASCII码然后再进行运算。

s="szzyfimhyzd"
res=''
for i in s:
    y=17*ord(i)-8
    res+=chr(y)
print(res)

得出了一串毫无意义的字符。
ޛࠒࠒࠁھ۱ܵ۠ࠁࠒڜ
最后一看题目:affine(仿射)
居然连非常基础的仿射密码都忘记了。
用一下自己之前写过的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值