强网杯-crypto modestudy

1、modestudy
这道题nc过后发现该题分为六个部分
(1)challenge1
[$] challenge 1
[+] cookie:session=6b1f33a78c5b9c17;admin=0;checksum=552ebbeb9276a8cd9f741b7d29f8c9e1eb455757207ac420659e7eab56ddee25
[+] checksum=aes128cbc.encrypt(session=6b1f33a78c5b9c17;admin=0)
[+] only admin can see flag
[-] cookie:(待输入)

![cbc
](https://img-blog.csdnimg.cn/20200831203215331.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L29zaWVyMTIzNDU=,size_16,c
根据CBC的加密模式,我们为了得到明文首先应该将密文解密,再与前一组密文进行模加才会得到明文,根据题意,我们需要得到明文为admin=1的该组的输入值才能破解该关卡。所以根据加密模式我们将校验和代入先与0异或再与1异或即可得到输入值,破解challenge1。
主要再与对CBC加密模式的理解,主要是加密过后的密文会作为密钥再对下一步进行加密,这也是破解CBC密码的关键。异或之后可以得到输入值:
session=0037f692a72e8507;admin=0;checksum=994456fcdcabb9f7f1f0c2c950f
e6e4aa311c4397734780e96a7d2396a125c43

(2)challenge2
[$] challenge 2
[+] sha256(iv)=11f595abc9d7b986d24fce986d1f9ddfb0d83f2f978db20b862ea730e570bff0
[+] 1. server’s job: print aes_cbc_dec(key,iv,your_input_c).encode(‘hex’)
[+] 2. your job: guess iv
[-] your choice:(待输入)
看了大佬的wp之后看出来了这是CBC的选择密文攻击(菜鸡表示对CBC似乎没多大了解,上次魔改aes的时候只接触过一次CBC)
还是根据CBC加密的特点,由于输入的密文作为下一轮加密的密钥,所以我们假设第一轮输入的密文是C0,第二轮是C1,第一轮输出的明文是M0,第二轮是M1,那么dec(c0) = m0 ^ iv,dec(c1) = m1 ^ c0,如果我们令两次输入的密文相同,那么iv = m0 ^ m1 ^ c0,所以只要输入两段相同的16字符内容,在分别对这两段内容进行加密,将三个部分进行异或,就可以得到iv
解得iv=ee42fad0d874a822f3d462302c4ef1e6

(3)challenge3
[$] challenge 3
[+] cookie=session:0884ce7c;timedl=1;admin=0;guess_cookie_ma=1;guess_mp_ab=1;guess_cookie_mb=0;hell_pad=233
[+] 128bit_ecb_encrypt(cookie):0632b3e7adb2f6d5ae4a92f553f2f4a4c9f95b099cfd8e3408137d134eb51d147045f278246a831fabdbdccde099b4b694b07e699ffae6a82c6cfbc4454816b1c78e5d1be8b67e235fbbfd2a75e73f32bac806808bc2e102db8f2c159b250415
[+] only admin can see the flag
[-] input your encrypted cookie(encode hex):(待输入)
该题使用了ECB加密模式,与1相同,依然是当admin=1的时候可以通过,那么根据分组加密的长度进行分组:

第 1 分组 session:f8e9b447
第 2 分组 ;timedl=1;admin=
第 3 分组 0;guess_cookie_m
第 4 分组 a=1;guess_mp_ab=
第 5 分组 1;guess_cookie_m
第 6 分组 b=0;hell_pad=233
看大佬wp发现了神奇的事情,第三组和第五组只相差一个字符,将第三组的密文和第五组的密文交换,就可以使得admin=1,输入新的密文,即可进入下一环节
强力补课了一波ECB,主要是对ECB模式的攻击方法,ECB的显著弱点是不破解密文也可以操纵明文,详细可见https://blog.csdn.net/chengqiuming/article/details/82262417,该题的破解方法就是利用ECB加密的弱点,在不破解密文的情况下对明文直接进行操作,最终可以得到本轮的输入值6e0b333f565abac1949c208b4b98313399f460d5aeabb631e24895fa017a9012656db
f3ce6b036f949a3b2bf9feb6acca32a7460f01c4fad467ee054979c8b05656dbf3ce6
b036f949a3b2bf9feb6acce7b2e3a521ca2d3c5b21e5ef7c2d51c3

(4)challenge4
[$] challenge 4
[+] sha256(secret)=d014cbddd2cbb0fa2404c519c166bc85c03ee3445d643f451a5f5d6244e7e34d
[+] assert len(secret)==16
[+] 1. server’s job: print aes_ecb(key,input+secret+’\x00’*((16-(len(input+secret) % 16)) % 16))
[+] 2. your job: guess secret
[-] your choice:(待输入)
根据观察可知又是ECB的加密模式,根据wp的提示按位爆破(主要是由于ECB加密的每个模块之间并不相关),最后一位可以任意尝试,然后与sha值进行比较用来确定secret的最后一位,然后再进行第二位的爆破,重复上述步骤,直到所有都被爆破出来。
我只尝试爆破了前6位,真的太考验耐心了,也可能是我没找到其中有什么规律(但我个人认为哈希函数应该也没有什么规律,毕竟他是不可逆的),所以就失去耐心直接参考wp给出的secret值:
3567935aebe5e517caf233dbc7cb9959
代码如下:

def solve_step_4(level, known):
    print "Level %s" % str(level)
    if(level == 16):
        return known
    records = []
    for i in range(256):
        p

你可能感兴趣的:(强网杯-crypto modestudy)