[tum ctf 2016] haggis - crpyto

CTF 2016. 10. 3. 22:42

우선

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
Posted by goldpapa
,