우선
https://ctftime.org/writeup/4290
여기를 보고 이해했음
학교에서 ECB와 CBC 가 중간고사에 나왔고 퀴즈에 나올때마다 맞았으나 정장 문제는 못풀었다는 거...
#!/usr/bin/env python3 import os, binascii, struct from Crypto.Cipher import AES pad = lambda m: m + bytes([16 - len(m) % 16] * (16 - len(m) % 16)) def haggis(m): crypt0r = AES.new(bytes(0x10), AES.MODE_CBC, bytes(0x10)) return crypt0r.encrypt(len(m).to_bytes(0x10, 'big') + pad(m))[-0x10:] target = os.urandom(0x10) print(binascii.hexlify(target).decode()) msg = binascii.unhexlify(input()) if msg.startswith(b'I solemnly swear that I am up to no good.\0') \ and haggis(msg) == target: print(open('flag.txt', 'r').read().strip()) |
이제 붙여넣기가 잘 되네..
python3이라서 좀 찾아보다가...
여기에서 취약점
1. 키를 다 가르쳐 준다. 암호화 키와 IV를 알려주기 때문에 복호화가 가능
2. 중간에 내가 끼워 넣어서 MAC를 변조 할 수 있음
코드가 아니라 구술 시험이었으면 답변할 수 있었을 것이나..이것이 아니라
적당히 변조한 데이터에 대하여 중간 단계에서 사이퍼를 구한 다음 내가 구하고자 하는 MAX을 적당히 디코드 한 데이터와 XOR한 값을 구한 다음, 초기 데이터에 붙여서 보내면 됨
아래는 POC 코드, 이 정도는 두어시간내에 풀어야 함
#!/usr/bin/env python3 import os, binascii, struct from Crypto.Cipher import AES pad = lambda m: m + bytes([16 - len(m) % 16] * (16 - len(m) % 16)) def haggis(m): crypt0r = AES.new(bytes(0x10), AES.MODE_CBC, bytes(0x10)) return crypt0r.encrypt(len(m).to_bytes(0x10, 'big') + pad(m))[-0x10:] def sxor(s1, s2): return bytes([c1 ^ c2 for (c1, c2) in zip(s1, s2)]) target = binascii.unhexlify('5795c05b06c7cae52d3744e5e104bc27') msg = b'I solemnly swear that I am up to no good.\0'+b'A'*6 aes = AES.new(bytes(0x10), AES.MODE_ECB) #aes = AES.new(bytes(0x10), AES.MODE_CBC, bytes(0x10))
t12 = aes.decrypt(target) t11 = sxor(t12,b'\x10'*16) print (12,binascii.hexlify(t12)) print (11,binascii.hexlify(t11)) aes = AES.new(bytes(0x10), AES.MODE_ECB) #aes = AES.new(bytes(0x10), AES.MODE_CBC, bytes(0x10)) t2 = aes.decrypt(t11) print (2,binascii.hexlify(t2)) t3len = len(msg) + 0x10 t3buf = t3len.to_bytes(0x10, 'big') + msg aes = AES.new(bytes(0x10), AES.MODE_CBC, bytes(0x10)) t3 = aes.encrypt(t3buf)[-0x10:] print (3,binascii.hexlify(t3)) t4 = sxor(t2,t3) aes = AES.new(bytes(0x10), AES.MODE_CBC, bytes(0x10)) t2r = aes.encrypt(t2) print ('t2r',binascii.hexlify(t2r)) aes = AES.new(bytes(0x10), AES.MODE_CBC, bytes(0x10)) t9 = aes.encrypt(t3buf+t4+b'\x10'*16)[-0x10:] print ('>>>>0808???',binascii.hexlify(t3buf+t4+b'\x10'*16)) print (9,binascii.hexlify(t9)) ans = haggis(msg+t4) print(len(msg+t4)) print ('answer',binascii.hexlify(ans)) print ('target',binascii.hexlify(target)) |
'CTF' 카테고리의 다른 글
pwnable templete from alex (0) | 2016.12.27 |
---|---|
[tum ctf 2016] hiecss - crpyto (0) | 2016.10.05 |
[SCTF 2016] pwn2 한땀 한땀 ROP read /bin/sh (0) | 2016.09.16 |
[tokyo 2016] ReverseBox (0) | 2016.09.12 |
[tokyo ctf 2016]greeting (0) | 2016.09.06 |