title: 【寒假学习计划】-CTF刷题记录
tags:
- CTF
- 假期学习
abbrlink: 5e6c9a08
date: 2022-02-09 11:05:59
RE
BUUCTF-re-[GWCTF 2019]re3(SMC自修改代码 | AES加密)
使用IDA64载入,在侧边栏找到main函数查看

由第9行代码可得,输入关键字长度为32,第14行mprotect将程序修改为可读可写可执行,第15行开始则对程序进行了SMC自修改,给函数异或了0x99。
发现内容疑似还有加密,进行FindCrypt分析,得出有以下加密方式

进入sub_402219查看,此时看到的是一些无意义的数据

编写idc脚本对上述内容进行解密
#include <idc.idc>static main(){auto addr = 0x402219;auto i = 0;for(i=0;i<224;i++){PatchByte(addr+i,Byte(addr+i)^0x99);}}
解密后将这部分函数内容进行Force分析

接着将分析内容生成为函数并转换为伪代码


接着分析40207B

经过分析可知,仅有第10行、14行的加密有实际作用,基本逻辑为将base64密码表进行两次sub_401CF9加密后赋给a1,通过动态调试可以得到此处的结果


最终结果即unk_603170为
CB8D493521B47A4CC1AE7E62229266
接着继续分析sub_402219

可得加密后的密文为
BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B
再分析sub_40196E

可得大致流程如下:
- 经过MD5后得到AES ECB模式的密钥
- 将输入分为两部分,分别进行AES128加密
- 与密文进行比较
因此可写出脚本
from Crypto.Cipher import AESfrom Crypto.Util.number import *key = long_to_bytes(0xcb8d493521b47a4cc1ae7e62229266ce)mi = long_to_bytes(0xbc0aadc0147c5ecce0b140bc9c51d52b46b2b9434de5324bad7fb4b39cdb4b5b)lun = AES.new(key, mode=AES.MODE_ECB)flag = lun.decrypt(mi)print(flag)
运行结果:

