掀桌子

掀桌子(来源:攻防世界)

1.关卡描述


2.解题步骤


分析:

给了一份报文:

c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2

这是DDCTF2018,不会太简单,看着上面像16进制转ASCII一下:

利用base全家桶解密一下:

都没有得到有效的信息,没有任何思路。

=================

参考别人的writeup

思路:分析字符串的频率

import string

total = 0
cipertext = "c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2"
for i in string.printable:
    if i in cipertext:
        print(i)
        total = total + 1

print("总共有字符:",total,"个")     

all = 0
for i in cipertext:
    all = all + 1

print("所有字符有:",all)

(对这个脚本还有一点想说的是,空格是可打印的字符,也就是说如果我们的字符串很多时,使用“”“存在的空格也会计算,利用防斜杆\处理,计算总共字符没问题,但计算所有字符会出现问题,但可以利用读取文件的方式进行解决,需要修改代码)

从脚本你的结果上看我们的进攻方向是在16进制上

实际上我们大致看也能看出来,知道方向后,我们让其16进制转ASCII码,发现一堆乱七八糟的字符,那么如何去解,字符是16进制,且118是2的倍数,我们可以两个两个拆分出来:

再回去观察一下这段十六进制字符,每两位一组,(注:这里的字符串与攻防世界提供的字符串不一样,理解原理即可)

['d4', 'e8', 'e1', 'f4', 'a0', 'f7', 'e1', 'f3', 'a0', 'e6', 'e1', 'f3', 'f4', 'a1', 'a0', 'd4', 'e8', 'e5', 'a0', 'e6', 'ec', 'e1', 'e7', 'a0', 'e9', 'f3', 'ba', 'a0', 'c4', 'c4', 'c3', 'd4', 'c6', 'fb', 'b9', 'b2', 'b2', 'e1', 'e2', 'b9', 'b9', 'b7', 'b4', 'e1', 'b4', 'b7', 'e3', 'e4', 'b3', 'b2', 'b2', 'e3', 'e6', 'b4', 'b3', 'e2', 'b5', 'b0', 'b6', 'b1', 'b0', 'e6', 'e1', 'e5', 'e1', 'b5', 'fd']

发现都很大 ,都是以字母开头的十六进制。有多大呢,把它转换成十进制,更加直观地体会一下:

[212, 232, 225, 244, 160, 247, 225, 243, 160, 230, 225, 243, 244, 161, 160, 212, 232, 229, 160, 230, 236, 225, 231, 160, 233, 243, 186, 160, 196, 196, 195, 212, 198, 251, 185, 178, 178, 225, 226, 185, 185, 183, 180, 225, 180, 183, 227, 228, 179, 178, 178, 227, 230, 180, 179, 226, 181, 176, 182, 177, 176, 230, 225, 229, 225, 181, 253]

那为什么说它大呢,因为ASCII可见字符的十进制取值范围为32—126 ,所以上面的字符串转换成ASCII字符以后,出现的都是些非可见字符,也就是刚刚所提到的奇奇怪怪的字符。

那么要得到可见字符,就要把它们的值限制在[32,126] 之内,所以我们对其取128的余数 (为什么是128而不是127呢,这是习惯性选择2的8次方的结果吧),结果:

[84, 104, 97, 116, 32, 119, 97, 115, 32, 102, 97, 115, 116, 33, 32, 84, 104, 101, 32, 102, 108, 97, 103, 32, 105, 115, 58, 32, 68, 68, 67, 84, 70, 123, 57, 50, 50, 97, 98, 57, 57, 55, 52, 97, 52, 55, 99, 100, 51, 50, 50, 99, 102, 52, 51, 98, 53, 48, 54, 49, 48, 102, 97, 101, 97, 53, 125]

好,终于可以尝试转换为ASCII字符了:

['T', 'h', 'a', 't', ' ', 'w', 'a', 's', ' ', 'f', 'a', 's', 't', '!', ' ', 'T', 'h', 'e', ' ', 'f', 'l', 'a', 'g', ' ', 'i', 's', ':', ' ', 'D', 'D', 'C', 'T', 'F', '{', '9', '2', '2', 'a', 'b', '9', '9', '7', '4', 'a', '4', '7', 'c', 'd', '3', '2', '2', 'c', 'f', '4', '3', 'b', '5', '0', '6', '1', '0', 'f', 'a', 'e', 'a', '5', '}']

得到flag

利用脚本:

key = 'd4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c' \
      '6fbb9b2b2e1e2b9b9b7b4e1b4b7e3e4b3b2b2e3e6b4b3e2b5b0b6b1b0e6e1e5e1b5fd'

list1 = []
for x in range(0,len(key),2):
    k = key[x:x+2]
    list1.append(k)
print(list1)

list2 = []
for x in range(0,len(list1)):
    list2.append(int(list1[x],16))
print(list2)

list3 = map(lambda x:x%128,list2)
list33 = list(list3)
print(list33)

list4 = map(chr,list33)
list44 = list(list4)
print(list44)

flag = ''.join(list44)
print(flag)

===============

其他思路(没有了)及其脚本:

简单脚本(前提都是知道思路的)

1.

2.

3.

4.

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值