2020安洵杯——EasyCM WriteUP

概述

  1. 入口点: 这题用到了 TLSCallbackmain 函数前执行各种解密操作, 在 IDA 中按下 Ctrl+E 可以找到所有的入口点
  2. 置换用的码表在 TLSCallback 中进行了解密, 调试环境下会置换为垃圾数据
  3. 关键的加密函数是 SMC 技术保护的

详细

反调

  • 使用了 CheckRemoteDebuggerPresent 这个 API, 处于调试环境下时返回值为 1
  • 下图的函数在其中一个 TLSCallback 中被调用, 对置换用的码表进行解密. 可见当处于调试环境时不会进行解密的操作.

花指令

  • 花指令用于误导 IDA 的静态反汇编. 本题中的花指令都比较简单, 都是通过控制 retn 时栈顶的 eip 控制跳转. 当时做题的时候傻乎乎的动调, 现在反应过来了, 应该直接推算出跳转到哪, 然后用 IDA patch 上就行了
  • 举例来说, 在 SMC 进行自揭密的函数中, 明显有花指令的干扰
  • 把没用的全 nop 掉, 条件跳转改成 jmp 即可

SMC

  • 这里进行了 SMC 的自解密, 当然也有几处花指令, 全部改了之后非常清晰
  • 可以写个 IDAPython 脚本修改 idb
    def unpack_cyzcc():
        f = open("backup", "wb")
        key = b'D0g3'
        start = 0x41e000
        length = 0x1200
        for i in range(length):
            ea = start+i
            old = idc.Byte(ea)
            f.write(bytes(old))
            k = key[i % 4]
            new = old ^ k
            idaapi.patch_byte(ea, new)
    

写脚本解密

  • 按照上面说的把所有该 patch 的都 patch 了其实这道题就非常简单了
  • 解密脚本:
    import idc
    import 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值