Gerrys

源于热爱!

DDCTF --(╯°□°)╯︵ ┻━┻

前几天参加了一下DDCTF,然而只做了一道给了flag的1分的题,真是太菜了,misc2最头疼,那么多人做出来,自己愣是没思路,想来想去不知道咋弄,有大佬提示转回ascll的可见就可以了,然而听不懂这句话。。比赛结束了,大佬说几个脚本就出来结果了,然而正在学习python 还不会写。。。。。太弱了。。看了大佬的wp,简单总结下思路吧。。


1、拿到题目看到

d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb7b9b8e4b5b5e4e2b7b6b5b5b2e1b9b2b2e4b0b0e4b7b7b5e5b3b3b1b1b9b0b7fd 会是什么编码呢,尝试了很多编码,然而没什么用,题目名字是掀桌,咋掀???? 一脸懵逼。。看着出现的字母是0-9 a-f 应该是16进制,接下来怎么办呢??转化?也没啥用!

2、看了大佬的wp,感觉确实不难。。。。几个简单的脚本的而已。大体分为三步,先分析字符串,并判断出为16进制,然后两个字节一位转化,得到的远远超过ascll 形式,应该是用到了凯撒,ascll有138字符,减去128 得到了flag。

3、详细总结一下。

   (1)分析字符串看看出现的字符有哪些。

import string                #引入string
cipertext ="d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb7b9b8e4b5b5e4e2b7b6b5b5b2e1b9b2b2e4b0b0e4b7b7b5e5b3b3b1b1b9b0b7fd"
for i in string.lowercase:   #string.lowercase 26个小写字母
    if i in cipertext:       
        print (i)            #打印出字符串中出现的小写字母
for i in string.digits:      #string.digits 数字0-9
    if i in cipertext:
        print (i)            #打印出字符串中出现的数字                     

         运行结果:a b c d e f 0 1 2 3 4 5 6 7 8 9  由此判断为16进制。

    (2)利用len() 得到字符串为134位  16进制应该是两个字节一位,转化。

cipertext = "d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb7b9b8e4b5b5e4e2b7b6b5b5b2e1b9b2b2e4b0b0e4b7b7b5e5b3b3b1b1b9b0b7fd"
i = 0        
plaintext = ""
while i < 133: 
    plaintext += str(int(cipertext[i:i + 2],16)) + " " # += 意为连接字符串,每相邻的两个字符16进制转化。
    i += 2
print plaintext 

        运行结果: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 183 185 184 228 181 181 228 226 183 182 181 181 178 225 185 178 178 228 176 176 228 183 183 181 229 179 179 177 177 185 176 183 253  ascll范围为128 显然超出范围,考虑凯撒,减去128

  (3)16进制转化再减去128,并且返回ascll对应的字符。

cipertext = "d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb7b9b8e4b5b5e4e2b7b6b5b5b2e1b9b2b2e4b0b0e4b7b7b5e5b3b3b1b1b9b0b7fd"
i = 0
plaintext = ""
while i < 133:
    asciinum = int(cipertext[i:i + 2],16)-128  #16进制解密得到的ascll整数减去128
    plaintext += chr(asciinum)                 #chr 返回ascll对应的字符。
    i += 2
print plaintext

    运行结果:That was fast! The flag is: DDCTF{798d55db76552a922d00d775e3311907}

4、思路总结。

     此题目涉及的是16进制 以及ascll的变形,首先应该熟悉各种进制,特别是16进制,特征是0-9 a-f 容易判断,其次看到16进制要转化,看到整型数字想到ascll码,ascll码范围是128,超出128 考虑凯撒。还要继续深入学习各种编码。

5、涉及的python脚本。

    string 模块参考 http://python.jobbole.com/88379/

    int()  函数用于将一个字符串或数字转换为整型

            语法

int(x, base=10)  # x字符串或数字  base 进制 默认10进制。

   chr()  范围在 range(256)内的整数作参数,对应的字符,是当前整数对应的ascii字符。

            语法

chr(i)   




阅读更多
文章标签: CTF
个人分类: MISC
想对作者说点什么? 我来说一句

DDCTF-Normal

2017年07月03日 1.03MB 下载

没有更多推荐了,返回首页

不良信息举报

DDCTF --(╯°□°)╯︵ ┻━┻

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭