ღ Miranda

实验吧密码学writeup(三)

参考了多方writeup解题,做一点整理。

他的情书

题目链接: http://www.shiyanbar.com/ctf/1812

解题链接点进去是一个输入密码的页面,可鼠标移上去会自动隐藏,右键也被禁止了,使用chrome的开发者工具查看源码得到几段经过加密的js代码,先看[][(![]+[])这段,直接在浏览器执行得到提示urldecode,把urlencode的一段代码解密得到一段js加密的代码,解码得到核心代码:

function zhegejiamiyidiandoubuku() {
    var pass = document.form.passwd.value;
    var cry = "Rm9yM0re354v5E4FUg5FasDboooo==";
    var addr = 'soroki.php?passwd=';
    var locatie = location.href;
    var out = '';
    var pass2 = cry.substring(15, 4 * 4) + cry.substring(24, 5 * 5) + cry.substring(0, 1) + cry.substr(7, 1) + cry.substr(11, 1) + cry.substr(13, 1) + cry.substring(3 + 3, 7);
    pass = locatie.substr(locatie.indexOf('?') + 1);
    addr = addr.substring(0, addr.indexOf('?') + 1) + 'l0vau=';
    for (i = 0; i < pass.Len; i++) {
        if (pass.charAt(i) == pass2.charAt(i)) {
            document.write(pass.charAt(i))
        }
    }
    location = addr + pass
}

分析后访问http://ctf4.shiyanbar.com/crypto/4/soroki.php?l0vau=FoRevEr这个url得到base64加密的字符串,解密得到in2 say:I love you Forever!The Girl say: zqc{fkqtl_fp_yfd_py},对zqc{fkqtl_fp_yfd_py}进行凯撒解密得到flag: ctf{intwo_is_big_sb}


js

题目链接: http://www.shiyanbar.com/ctf/1779

打开网页是一段js加密的代码,直接复制执行发现有错误,查看源代码,复制源代码在浏览器里执行得到一段编码后的字符串,直接alert执行得到flag: SimCTF{js_encode}


NSCTF crypto200

题目链接: http://www.shiyanbar.com/ctf/1768

下载得到一张黑色的图片,使用stegsolve输出一张类似二维码的图片,看了半天看不出来,最后知道是二维码黑白色相反的,使用python脚本得到正确的二维码,扫一扫得到flag: flag{NSCTF_Qr_C0De}

>>> from PIL import Image
>>> im = Image.open('/Users/SevieZhou/Downloads/solved.jpg')
>>> im.point(lambda i: 0 if i&1 else 255).show()

NSCTF crypto50

题目链接: http://www.shiyanbar.com/ctf/1758

题目是一串字符串,AES解密得到flag{DISJV_Hej_UdShofjyed}看来是经过凯撒加密的,解密得到flag: flag{NSCTF_Rot_EnCryption}


黑客叔叔(雨袭团)内部交流题(第一季1.0.2)

题目链接: http://www.shiyanbar.com/ctf/1744

题目很多行,拼起来,有许多加号,想到是DES加密,但有几个文字,得知把文字换成/,把最后两个等等换成==,然后TripleDes解密得到U2FsdGVkX19RFyuUWyBHLNo8ldVPSkFpTB/lG07bZIL1rSAa/L0jFRGdvPh//8W4uZHe,最后rabbit解密,得到flag: RainRaid_Flag_Rabbit&TripleDes_Nice


黑客叔叔(雨袭团)内部交流题(第一季1.0.1)

题目链接: http://www.shiyanbar.com/ctf/741

题目是一串字符串,拿去base64解密得到:

UmFpblJhaWRfRmxhZ19zMF9meGNrMW45X3doNHQ
|01|03|07|+|+1|+3|+7|2+1|2+2|2+6|2+7|2+9|3+0|3+3|3+7|3+8|3+9|?|

后面的数字指示了前面的字母大小写变化的规则,|01|03|07|表示1,3,7个变为大写,|2+1|2+2|2+6|2+7|2+9|3+0|3+3|3+7|3+8|3+9|表示21,22…变为大写,最后看|+|+1|+3|+7|的意思是|1+0|1+1|1+3|1+7|,依次改过来得到:

UmFpblJhaWRfRmxhZ19zMF9meGNrMW45X3doNHQ

base64解密得到flag: RainRaid_Flag_s0_fxck1n9_wh4t


simple algorithm

题目链接: http://www.shiyanbar.com/ctf/737

下载得到一个txt和一个py脚本,txt文件内容是用脚本的程序加密得到了,加密过程大概是先把flag用hex编码,再变成10进制的iflag,每次从iflag中取两位进行加密,所以每次取数的范围为00-99,所以可已生成一个字典,用字典中的值对比密文,解出明文,脚本如下:

import codecs


 #题目给出的加密函数
def FAN(n, m):
    i = 0
    z = []
    s = 0
    while n > 0:
        if n % 2 != 0:   
            z.append(2 - (n % 4))    
        else:    
            z.append(0)    
        n = (n - z[i])/2     
        i = i + 1
    z = z[::-1]  
    l = len(z)
    for i in range(0, l):
        s += z[i] * m ** (l - 1 - i)   
    return s

 #生成密码字典
def generate_dict():
    cipher={}
    for i in range(100):
        cipher[str(int(FAN(i, 3)))] = "%02d"%i
    return cipher

 #生成iflag
def generate_iflag(s, cipher):
    result=[]
    i=0
    while True:
        for j in (4, 3, 2, 1):
            if s[i:i+j] in cipher:
                result.append(cipher[s[i:i+j]])
                i+=j
                break
        if i>len(s)-1:
            break
    return ''.join(result)

def sovle():
    s=open("enc.txt").read().strip()  #读取密文
    cipher = generate_dict() 
    iflag = generate_iflag(s, cipher)
    #这里因为切片操作对于最后是09还是9取出的结果都一样  
    #Hex编码是每个字节转化为两个字节,所以编码后长度为偶数
    if len(hex(int(iflag)))%2!=0:
        iflag=iflag[:-2]+iflag[-1]
    flag = codecs.decode(hex(int(iflag))[2:], 'hex')
    print(flag)


if __name__ == '__main__':
    sovle()

运行得到flag: SIS{a9ab115c488a311896dac4e8bc20a6d7}

  1. Hi there, just wanted to tell you, I loved this article. It was helpful.

    Keep on posting!

发表评论

电子邮件地址不会被公开。