题目链接:https://buuoj.cn/challenges#[GWCTF%202019]re3
用PEID的Krypto插件扫描文件
可能存在base64,md5和AES。
用IDA查看main函数,发现了自修改,是一个简单的异或操作
所以ida无法识别该函数
在ida中利用idapython脚本修改代码
key=[0xCB, 0x8D, 0x49, 0x35, 0x21, 0xB4, 0x7A, 0x4C, 0xC1, 0xAE, 0x7E, 0x62, 0x22, 0x92, 0x66, 0xCE]
text=[ 0xBC, 0x0A, 0xAD, 0xC0, 0x14, 0x7C, 0x5E, 0xCC, 0xE0, 0xB1, 0x40, 0xBC, 0x9C, 0x51, 0xD5, 0x2B, 0x46, 0xB2, 0xB9, 0x43, 0x4D, 0xE5, 0x32, 0x4B, 0xAD, 0x7F, 0xB4, 0xB3, 0x9C, 0xDB,0x4B, 0x5B]
key=bytes(key)
text=bytes(text)
mode = AES.MODE_ECB
cryptor = AES.new(key, mode)
decrypt_text=cryptor.decrypt(text)
print (b2a_hex(decrypt_text))
text=[ 0xBC, 0x0A, 0xAD, 0xC0, 0x14, 0x7C, 0x5E, 0xCC, 0xE0, 0xB1, 0x40, 0xBC, 0x9C, 0x51, 0xD5, 0x2B, 0x46, 0xB2, 0xB9, 0x43, 0x4D, 0xE5, 0x32, 0x4B, 0xAD, 0x7F, 0xB4, 0xB3, 0x9C, 0xDB,0x4B, 0x5B]
key=bytes(key)
text=bytes(text)
mode = AES.MODE_ECB
cryptor = AES.new(key, mode)
decrypt_text=cryptor.decrypt(text)
print (b2a_hex(decrypt_text))
修改之后强制分析所选区域代码,按p生成函数,回到main函数按F5即可得到修改后的伪代码
查看sub_402219函数
不难看出这部分是AES加密,因为不存在iv,所以加密模式是ECB。 sub_40207B将生成的密钥保存至unk_603170,而生成密钥的过程和用户输入内容无关所以不必深入,可通过动态调试获取密钥。
sub_400A71函数对密钥进行了密钥扩展,后面的函数对分成两部分的用户输入进行AES加密。
密钥为CB8D493521B47A4CC1AE7E62229266CE
根据密钥长度判断出是AES128加密。byte_6030A0是AES的密文,
密文为BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B
已知密文和密钥,可以写脚本得到明文了
script:
#!/usr/bin/python3
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
key=[0xCB, 0x8D, 0x49, 0x35, 0x21, 0xB4, 0x7A, 0x4C, 0xC1, 0xAE, 0x7E, 0x62, 0x22, 0x92, 0x66, 0xCE]
text=[ 0xBC, 0x0A, 0xAD, 0xC0, 0x14, 0x7C, 0x5E, 0xCC, 0xE0, 0xB1, 0x40, 0xBC, 0x9C, 0x51, 0xD5, 0x2B, 0x46, 0xB2, 0xB9, 0x43, 0x4D, 0xE5, 0x32, 0x4B, 0xAD, 0x7F, 0xB4, 0xB3, 0x9C, 0xDB,0x4B, 0x5B]
key=bytes(key)
text=bytes(text)
mode = AES.MODE_ECB
cryptor = AES.new(key, mode)
decrypt_text=cryptor.decrypt(text)
print (b2a_hex(decrypt_text))
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
key=[0xCB, 0x8D, 0x49, 0x35, 0x21, 0xB4, 0x7A, 0x4C, 0xC1, 0xAE, 0x7E, 0x62, 0x22, 0x92, 0x66, 0xCE]
text=[ 0xBC, 0x0A, 0xAD, 0xC0, 0x14, 0x7C, 0x5E, 0xCC, 0xE0, 0xB1, 0x40, 0xBC, 0x9C, 0x51, 0xD5, 0x2B, 0x46, 0xB2, 0xB9, 0x43, 0x4D, 0xE5, 0x32, 0x4B, 0xAD, 0x7F, 0xB4, 0xB3, 0x9C, 0xDB,0x4B, 0x5B]
key=bytes(key)
text=bytes(text)
mode = AES.MODE_ECB
cryptor = AES.new(key, mode)
decrypt_text=cryptor.decrypt(text)
print (b2a_hex(decrypt_text))
ascii解码后得到flag