文章目录

  • 概述
  • 详细
    • 反调
    • 花指令
    • SMC
    • 写脚本解密
  • 最近犯懒,没看新题,想起来之前安洵杯做过一道 SMC + 反调试的题,当时是动调 + 瞎蒙做出来的,今天来整理一下里面的知识点
  • 题目链接:https://github.com/D0g3-Lab/i-SOON_CTF_2020/tree/main/re/EasyCM
  • 需要用到的 IDA 插件(能够简化大量操作):IDACode & IDAPython

概述

  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 = 0x41e000length = 0x1200for i in range(length):ea = start+iold = idc.Byte(ea)f.write(bytes(old))k = key[i % 4]new = old ^ kidaapi.patch_byte(ea, new)
    

写脚本解密

  • 按照上面说的把所有该 patch 的都 patch 了其实这道题就非常简单了
  • 解密脚本:
    import idc
    import idaapidef unpack_cyzcc():f = open("backup", "wb")key = b'D0g3'start = 0x41e000length = 0x1200for i in range(length):ea = start+iold = idc.Byte(ea)f.write(bytes(old))k = key[i % 4]new = old ^ kidaapi.patch_byte(ea, new)def unpack_charset():start = 0x133010f = open("charset.bak", "wb")for i in range(64):ea = i+startc = idc.get_wide_byte(ea)f.write(bytes(c))new_b = ''if i >= 26:if i >= 45:new_b = c+122else:new_b = c+90else:new_b = c+57idaapi.patch_byte(ea, new_b)f.close()def get_data(start, end, data_type="byte"):data = []while start < end:if data_type == "byte":d = idc.Byte(start)start += 1data.append(d)return datadef solve():charset = get_data(0x133010, 0x133010+64, "byte")fake_flag = get_data(0x1330CC, 0x01330EC, "byte")cipher = get_data(0x01330A8, 0x01330c8, "byte")plain = []for i in fake_flag:print(chr(i), end='')for i in cipher:print(hex(i), end=',')for i in charset:print(chr(i), end='')def get_index(d):for i in range(64):if charset[i] == d:return ibreakpoint()for i in range(len(fake_flag)):cipher[i] ^= fake_flag[i]breakpoint()for i in range(len(cipher)//4):charset = charset[1:]+charset[0:1]tmp_cipher = cipher[4*i:4*i+4]a, b, c, d = [get_index(n)for n in tmp_cipher]plain.append(a << 2 & 0xC0 | c << 2 & 0x30 | d >> 2 & 0xC | b & 0x3)plain.append(b << 2 & 0xC0 | a << 2 & 0x30 | d >> 0 & 0xC | c & 0x3)plain.append(c << 2 & 0xC0 | b << 2 & 0x30 | d << 2 & 0xC | a & 0x3)for i in plain:print(chr(i), end='')if __name__ == "__main__":unpack_cyzcc()# unpack_charset()# solve()
    
  • 这题的关键就在于改那几个花指令, 改完之后分析出伪代码, 就非常简单了

2020安洵杯——EasyCM WriteUP相关推荐

  1. 2020 第三届安洵杯 MISC Writeup

    题目名称 签到 王牌特工 套娃 BeCare4 签到 Hint: 哥哥们注意文件名 大声说出fl4g.jpg 向公众号回复:fl4g 下载是flag.docx 复制那串特殊符号到记事本 Emojien ...

  2. 2021安洵杯Misc writeup

    忘了发了,来迟了 顺便发一下战队的全wp: https://wp.n03tack.top/posts/4906/ Misc 应该算是签到 来得早不如来的巧 CyzCC_loves_LOL 小脑洞+老考 ...

  3. 安洵杯SYCCTF2023 writeup

    一.MISC 1.sudoku_easy 简单的数独交互,几个小注意点,每次发送level之后sleep5秒才会返回题目 将形如 --------------------- 800103720 023 ...

  4. BUUCTF [安洵杯 2019]easy_serialize_php

    考点: 变量覆盖.反序列化中的对象逃逸 题目地址:BUUCTF在线评测 源码如下: <?php$function = @$_GET['f'];function filter($img){$fil ...

  5. BUUCTF:[安洵杯 2019]不是文件上传

    这题和攻防世界XCTF:upload有点像,看似上传却都不是上传是上传图片的文件名注入 参考:安洵杯2019 官方Writeup 获取源码 在网站首页存在一些信息 在gihtub找得到源码 BUU也给 ...

  6. 【BUUCTF】[安洵杯 2019]吹着贝斯扫二维码

    题目链接:[安洵杯 2019]吹着贝斯扫二维码. 下载压缩包解压得到这么一些文件,可以看到一堆未知类型文件和一个flag.zip 老规矩,把这些没有拓展名的文件用010Editor打开,发现都是jpg ...

  7. [安洵杯 2019]吹着贝斯扫二维码

    [安洵杯 2019]吹着贝斯扫二维码 压缩包解压后得到一些无后缀文件,和一个flag.zip 查看flag.zip内容发现尾部有类似base32的数据,先不管去看那些文件(这题其实可以用不到其他文件) ...

  8. 安洵杯-crackme-wp

    crackme 这是安洵杯2019的逆向题 链接:https://pan.baidu.com/s/16fb_-L-dE5knUPzkSFU5rQ 提取码:z405 文章目录 crackme 逆向分析 ...

  9. 安洵杯-game-wp

    game 安洵杯2019逆向 链接:https://pan.baidu.com/s/1vICnEqYfSezXUiTJU6C9TA 提取码:d9m7 题目的文件和idb分析文件和写出的python文件 ...

最新文章

  1. MyBatis 如何兼容所有日志框架?
  2. matlab 电磁兼容仿真软件,EMC Studio免费版
  3. 大数据日知录(一)数据分片与路由
  4. 营销获客场景下的工具类产品规划
  5. uni-app开发规范
  6. 樊正伦教授的养生之道中医文化与养生之---调情志
  7. thinkphp--多个id查询
  8. 数据分析在企业中的应用
  9. 关于安卓刷机的一些基础知识及术语
  10. 小猫爪:i.MX RT1050学习笔记24-eDMA之eDMASAIASRC的“纠缠”(RT1170)
  11. 视觉技术的圣杯:光线追踪如何再现真实世界?
  12. vtk体绘制代码报错的解决办法(代码在vtk7,8,9中都能运行),以及VTK数据集网站
  13. 米氏散射多次散射计算程序
  14. 监控mysql删除记录_监控删除记录
  15. RAID(独立磁盘冗余阵列)
  16. Silverlight 中文教程第二部分:使用布局管理 (木野狐译)
  17. 小试跨平台局域网文件传输工具NitroShare,几点感想
  18. springboot 2.x升级后出现Spring Security – There is no PasswordEncoder mapped for the id “null”的解决方案
  19. Go 实战 | 一文带你搞懂从单队列到优先级队列的实现
  20. python——csv读取文件报错:error:new-line character seen in unquoted field

热门文章

  1. 工作任务清单怎么写效率更高
  2. 聊聊大学室友在 TikTok 的工作和生活体验
  3. Java-对象转型(casting)
  4. 广州红海云计算股份有限公司获全球软件最高级别CMMI5认证
  5. STM32第一课(Keil, Type, macro)
  6. 微信授权登录,authorize不执行;uniapp 获取用户信息权限失败;无法通过wx.getUserInfo与<button open-type=“getUserInfo“/>获取用户个人信息
  7. Python+Appium实现京东双十一自动领金币
  8. Matlab龚珀兹曲线模型预测,第三章 趋势曲线模型预测法.ppt
  9. adaboost.M1与adaboost.M2差别比较
  10. HC32_HC32F072FAUA_从零开始搭建空工程模板