title: 【寒假学习计划】-CTF刷题记录
tags:

  • CTF
  • 假期学习
    abbrlink: 5e6c9a08
    date: 2022-02-09 11:05:59

RE

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

使用IDA64载入,在侧边栏找到main函数查看

【寒假学习计划】-CTF刷题记录 - 图1

由第9行代码可得,输入关键字长度为32,第14行mprotect将程序修改为可读可写可执行,第15行开始则对程序进行了SMC自修改,给函数异或了0x99。

发现内容疑似还有加密,进行FindCrypt分析,得出有以下加密方式

【寒假学习计划】-CTF刷题记录 - 图2

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

【寒假学习计划】-CTF刷题记录 - 图3

编写idc脚本对上述内容进行解密

  1. #include <idc.idc>
  2. static main()
  3. {
  4. auto addr = 0x402219;
  5. auto i = 0;
  6. for(i=0;i<224;i++)
  7. {
  8. PatchByte(addr+i,Byte(addr+i)^0x99);
  9. }
  10. }

解密后将这部分函数内容进行Force分析

【寒假学习计划】-CTF刷题记录 - 图4

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

【寒假学习计划】-CTF刷题记录 - 图5

【寒假学习计划】-CTF刷题记录 - 图6

接着分析40207B

【寒假学习计划】-CTF刷题记录 - 图7

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

【寒假学习计划】-CTF刷题记录 - 图8

【寒假学习计划】-CTF刷题记录 - 图9

最终结果即unk_603170

  1. CB8D493521B47A4CC1AE7E62229266

接着继续分析sub_402219

【寒假学习计划】-CTF刷题记录 - 图10

可得加密后的密文为

  1. BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B

再分析sub_40196E

【寒假学习计划】-CTF刷题记录 - 图11

可得大致流程如下:

  1. 经过MD5后得到AES ECB模式的密钥
  2. 将输入分为两部分,分别进行AES128加密
  3. 与密文进行比较

因此可写出脚本

  1. from Crypto.Cipher import AES
  2. from Crypto.Util.number import *
  3. key = long_to_bytes(0xcb8d493521b47a4cc1ae7e62229266ce)
  4. mi = long_to_bytes(0xbc0aadc0147c5ecce0b140bc9c51d52b46b2b9434de5324bad7fb4b39cdb4b5b)
  5. lun = AES.new(key, mode=AES.MODE_ECB)
  6. flag = lun.decrypt(mi)
  7. print(flag)

运行结果:

【寒假学习计划】-CTF刷题记录 - 图12