BUUCTF-re-[GWCTF 2019]re3------day.1
感觉作为CTFer RE手还是要做一下刷题日志的,此blog是第一篇,勉励自己。
题目链接:[GWCTF 2019]re3
main
直接拖进IDA,发现简易SMC,直接shift+F2调用以下脚本:
import idautils
import idc
addr = 0x402219 # 起始位置
for i in range(224):
patch_byte(addr+i, 0x99 ^ idc.get_wide_byte(addr+i))
主要加密函数便是下面两个
sub_40207B(&unk_603170);
sub_402219(s);
FindCrypt
使用FindCrypt插件发现有三个加密:MD5,AES,Base64,慌的一批
sub_40207B(&unk_603170)
可以点击BASE64_table_603120将其化为字符串后发现ida自动显示出来这几个字符串的名字。
这个函数的作用是为接下来的AES加密制作密钥。
动调分析:
sub_401CF9(int [64], ,int[16])
五次调用同一个函数,前4次每次用已有的64字节各生成一个16字节。
最后一次将4次生成16字节组合在一起,作为参数,加密&unk_603170.
sub_402219():经典AES加密
接下来我们来看sub_402219()函数,分析可知sub_400A71函数第二个参数是正好是2次base64后得到的&unk_603170,分析出其函数是AES初始化,而初始化必然需要key,因此猜测&unk_603170为AES加密的key。
而且发现此key的产生和输入无关,所以可以直接动调得到该key。
从sub_40196E函数点进去可以看到AES具体加密函数(就不多说分析过程了,各位师傅应该对此小菜一碟吧)
AES之后便是判断flag,从byte_6030A0处取得密文,然后开始写解题脚本咯!
解题脚本
from Crypto.Cipher import AES
from Crypto.Util.number import *
encrypted_data = long_to_bytes(0xbc0aadc0147c5ecce0b140bc9c51d52b46b2b9434de5324bad7fb4b39cdb4b5b)
key = long_to_bytes(0xcb8d493521b47a4cc1ae7e62229266ce)
aes_ = AES.new(key, mode=AES.MODE_ECB)
flag = aes_.decrypt(mi)
print(flag)
得到最终flag为flag{924a9ab2163d390410d0a1f670}