Ordinary keybord

这个题目为典型的凯撒密码变幻,最初题目已经给出了很多字母的对应形式。

李磊是一名程序员,在他的笔记本里有一些这样的记录:
QQ:iloveyou521
blog:blog132
wechat:wechat190

看着应该像是密码,于是尝试去登录,发现密码错误
后来一打听,原来他将这些密码经过自己写的一个简单的加密算法变成真实的密码,而自己笔记本中存放的只是一些虚假的密码,只是方便记忆而已

其真实密码如下:
QQ:+p)g$_)'521
blog:hp)u132
wechat:A$ezr&190

根据这些对应关系,先列出一直的对应关系如下:

i:+  105:43
l:p  108:112
o:)  111:41
v:g 118:103
e:$ 101:36
y:_  121:95
u:'  117:39
b:h 98:104
g:u 103:117
w:A 119:65
c:e  99:101
h:z 104:122
a:r  97:114
t:&  116:38

然后看flag格式如下:flag is spru.r5sf3h7660h7394e169699hffe0s0h$4,
其中spru肯定对应为flag,这样我们就又多了三个对应 f:s .:{ ,:} ,然后根据现有的对应关系,我们还看到,数字在加密时候不发生变化,这样一来,我们先试图将flag还原一下,还原之后flag为:flag{a5f?3b7660b7394c169699b??c0f0be4}
?代表的是未知,因为我们不知道哪一个字母和f对应,但是根据之前的对应关系,我们找出,还没有对应关系的字母只有k d j m n p q r s x z,然后我们依次试了一下,发现d是正确答案。flag为: flag{a5fd3b7660b7394c169699bddc0f0be4}

简单的密码

这个题需要nc对面的端口,nc之后发现如下回应:

题目意思很明确,通过nc我们可以得到(我们输入明文)的AES或者(我们输入的明文+flag)的AES。本题的AES加密为ECB,16个字符为一组。所以我们考虑一下问题:假设flag为flag{xxxxxxxxx}。当我们输入123456789012345的时候,输入的个数为15位,这样flag里面的内容就需要向前补一位,实际上第一组加密的字符串可能是123456789012345f。然后我们再加密123456789012345f,如果两次加密的前16位得出的结果一样的话,这就证明flag的第一位就是f。我们先试验一下。

由上图可知,我们的猜测是正确的,这个方法可行。然后我们继续验证123456789012和123456798012flag,发现依旧正确。

这样我们就可以开始编写脚本,逐位爆破flag,脚本如下:

#!/usr/bin/env python2
# -*- coding: UTF-8 -*-
import socket
HOST = '101.71.29.5'    # The remote host
PORT = 10014                # The same port as used by the server
s = None
temp='{1234567890}abcdefghijklmnopqrstuvwxyz_?#@!'
sock = socket.socket()
sock.connect((HOST,PORT))
szBuf = sock.recv(1024)
print(szBuf)
szBuf = sock.recv(1024)
print(szBuf)
t=str(2)+'\n'
b1=t.encode(encoding='utf-8')
sock.send(b1)
szBuf = sock.recv(1024)
print(szBuf)
t=str('1234567890')+'\n'
b1=t.encode(encoding='utf-8')
sock.send(b1)
szBuf = sock.recv(1024)
print(szBuf)
print szBuf[4:100]
xxx=str(szBuf[4:100])
szBuf = sock.recv(1024)
print(szBuf)
payload=str('1234567890flag{19d2c4bbb9ee4dd22537f1743f334df0')
for i in temp:
    t = str(2) + '\n'
    b1 = t.encode(encoding='utf-8')
    sock.send(b1)
    szBuf = sock.recv(1024)
    # print(szBuf)
    ppp=payload+i+'\n'
    # print(ppp)
    p=ppp.encode(encoding='utf-8')
    print(p)
    sock.send(p)
    szBuf = sock.recv(1024)
    # print(szBuf)
    # print szBuf[4:36]
    yyy=str(szBuf[4:100])
    if cmp(xxx,yyy)==0:
        print(yyy)
        print(1111111111111111111111111111111111111111111111)
        break
    szBuf = sock.recv(1024)

不知道是不是对面服务器的原因,socket老是阻塞,本来我想着直接一个脚本爆出来,然后发现有的时候爆破一位就需要阻塞好刺激,只能手动脚本逐位爆破,关键flag还是一个md5码(天啊),最终爆破得到flag如下:

然后通过nc对flag进行AES验证,发现和服务器给出的AES一模一样,get!

总结:每次ctf都会出一些新花样,虽然每次都有不会做的题目,但是希望从每次比赛中慢慢积累经验,慢慢学习,共勉!

源链接

Hacking more

...