re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密

新手一枚,如有错误(不足)请指正,谢谢!!
个人博客:点击进入/点击进入
题目链接:[GWCTF 2019]re3
参考资料:

  • Linux中mprotect()函数的用法
  • AES加密算法的详细介绍与实现

IDA64载入,shift+f12查找关键字,找到main函数。
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第1张图片
此时sub_402219处是一堆无用数据
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第2张图片
写idc脚本进行解密

#include 

static main()
{
     
    auto addr = 0x402219;
    auto i = 0;
    for(i=0;i<224;i++)
    {
     
        PatchByte(addr+i,Byte(addr+i)^0x99);
    }
}

然后强制分析数据成代码(选择Force)
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第3张图片
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第4张图片
全部选中摁P将其声明成函数
此时就可以F5伪代码查看了。。
使用Findcrypt插件查看一下加密算法……好多
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第5张图片
看main函数里的sub_40207B()函数
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第6张图片
一大堆忽悠人的MD5加密,,也就第10行和14行的MD5加密有用
大体是将base64密码表进行两次sub_401CF9加密然后赋值给参数a1
这里没有用到用户输入,可以动调一下获得加密后的a1
IDA先在sub_40207B()函数执行后一条下断点
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第7张图片
IDA远程调试运行,被断下来之后,双击跟进,获取到unk_603170
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第8张图片
提取出来,加密后的a1也就是unk_603170为

CB8D493521B47A4CC1AE7E62229266

然后看main函数里的sub_402219函数。
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第9张图片
加密后的密文为

BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B

其中sub_40196E函数
re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第10张图片

大体流程

  1. 经过MD5加密得到AES ECB模式的 密钥(可动调提取)
  2. 然后将32位的输入分成两部分,进行AES128加密
  3. 最后与密文进行比较

写脚本

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)

re学习笔记(54)BUUCTF-re-[GWCTF 2019]re3 SMC自修改代码 | AES加密_第11张图片

得到最终flag为flag{924a9ab2163d390410d0a1f670}

你可能感兴趣的:(ctf小白成长ing,#,reverse,信息安全,密码学,python,AES,reverse)