新手一枚,如有错误(不足)请指正,谢谢!!
<mark>个人博客:点击进入/点击进入</mark>
题目链接:[GWCTF 2019]re3
参考资料:
IDA64载入,shift+f12查找关键字,找到main函数。
此时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)
全部选中摁P将其声明成函数
此时就可以F5伪代码查看了。。
使用Findcrypt插件查看一下加密算法……好多
看main函数里的sub_40207B()函数
一大堆忽悠人的MD5加密,,也就第10行和14行的MD5加密有用
大体是将base64密码表进行两次sub_401CF9加密然后赋值给参数a1
这里没有用到用户输入,可以动调一下获得加密后的a1
IDA先在sub_40207B()函数执行后一条下断点
IDA远程调试运行,被断下来之后,双击跟进,获取到unk_603170
提取出来,加密后的a1也就是unk_603170为
CB8D493521B47A4CC1AE7E62229266
然后看main函数里的sub_402219函数。
加密后的密文为
BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B
其中sub_40196E函数
大体流程:
- 经过MD5加密得到AES ECB模式的 密钥(可动调提取)
- 然后将32位的输入分成两部分,进行AES128加密
- 最后与密文进行比较
写脚本
from Crypto.Cipher import AES
from 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)
得到最终flag为flag{924a9ab2163d390410d0a1f670}