2020安洵杯——EasyCM WriteUP
文章目录
- 概述
- 详细
- 反调
- 花指令
- SMC
- 写脚本解密
- 最近犯懒,没看新题,想起来之前安洵杯做过一道 SMC + 反调试的题,当时是动调 + 瞎蒙做出来的,今天来整理一下里面的知识点
- 题目链接:https://github.com/D0g3-Lab/i-SOON_CTF_2020/tree/main/re/EasyCM
- 需要用到的 IDA 插件(能够简化大量操作):IDACode & IDAPython
概述
- 入口点: 这题用到了
TLSCallback
在main
函数前执行各种解密操作, 在 IDA 中按下Ctrl+E
可以找到所有的入口点 - 置换用的码表在
TLSCallback
中进行了解密, 调试环境下会置换为垃圾数据 - 关键的加密函数是 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相关推荐
- 2020 第三届安洵杯 MISC Writeup
题目名称 签到 王牌特工 套娃 BeCare4 签到 Hint: 哥哥们注意文件名 大声说出fl4g.jpg 向公众号回复:fl4g 下载是flag.docx 复制那串特殊符号到记事本 Emojien ...
- 2021安洵杯Misc writeup
忘了发了,来迟了 顺便发一下战队的全wp: https://wp.n03tack.top/posts/4906/ Misc 应该算是签到 来得早不如来的巧 CyzCC_loves_LOL 小脑洞+老考 ...
- 安洵杯SYCCTF2023 writeup
一.MISC 1.sudoku_easy 简单的数独交互,几个小注意点,每次发送level之后sleep5秒才会返回题目 将形如 --------------------- 800103720 023 ...
- BUUCTF [安洵杯 2019]easy_serialize_php
考点: 变量覆盖.反序列化中的对象逃逸 题目地址:BUUCTF在线评测 源码如下: <?php$function = @$_GET['f'];function filter($img){$fil ...
- BUUCTF:[安洵杯 2019]不是文件上传
这题和攻防世界XCTF:upload有点像,看似上传却都不是上传是上传图片的文件名注入 参考:安洵杯2019 官方Writeup 获取源码 在网站首页存在一些信息 在gihtub找得到源码 BUU也给 ...
- 【BUUCTF】[安洵杯 2019]吹着贝斯扫二维码
题目链接:[安洵杯 2019]吹着贝斯扫二维码. 下载压缩包解压得到这么一些文件,可以看到一堆未知类型文件和一个flag.zip 老规矩,把这些没有拓展名的文件用010Editor打开,发现都是jpg ...
- [安洵杯 2019]吹着贝斯扫二维码
[安洵杯 2019]吹着贝斯扫二维码 压缩包解压后得到一些无后缀文件,和一个flag.zip 查看flag.zip内容发现尾部有类似base32的数据,先不管去看那些文件(这题其实可以用不到其他文件) ...
- 安洵杯-crackme-wp
crackme 这是安洵杯2019的逆向题 链接:https://pan.baidu.com/s/16fb_-L-dE5knUPzkSFU5rQ 提取码:z405 文章目录 crackme 逆向分析 ...
- 安洵杯-game-wp
game 安洵杯2019逆向 链接:https://pan.baidu.com/s/1vICnEqYfSezXUiTJU6C9TA 提取码:d9m7 题目的文件和idb分析文件和写出的python文件 ...
最新文章
- MyBatis 如何兼容所有日志框架?
- matlab 电磁兼容仿真软件,EMC Studio免费版
- 大数据日知录(一)数据分片与路由
- 营销获客场景下的工具类产品规划
- uni-app开发规范
- 樊正伦教授的养生之道中医文化与养生之---调情志
- thinkphp--多个id查询
- 数据分析在企业中的应用
- 关于安卓刷机的一些基础知识及术语
- 小猫爪:i.MX RT1050学习笔记24-eDMA之eDMASAIASRC的“纠缠”(RT1170)
- 视觉技术的圣杯:光线追踪如何再现真实世界?
- vtk体绘制代码报错的解决办法(代码在vtk7,8,9中都能运行),以及VTK数据集网站
- 米氏散射多次散射计算程序
- 监控mysql删除记录_监控删除记录
- RAID(独立磁盘冗余阵列)
- Silverlight 中文教程第二部分:使用布局管理 (木野狐译)
- 小试跨平台局域网文件传输工具NitroShare,几点感想
- springboot 2.x升级后出现Spring Security – There is no PasswordEncoder mapped for the id “null”的解决方案
- Go 实战 | 一文带你搞懂从单队列到优先级队列的实现
- python——csv读取文件报错:error:new-line character seen in unquoted field
热门文章
- 工作任务清单怎么写效率更高
- 聊聊大学室友在 TikTok 的工作和生活体验
- Java-对象转型(casting)
- 广州红海云计算股份有限公司获全球软件最高级别CMMI5认证
- STM32第一课(Keil, Type, macro)
- 微信授权登录,authorize不执行;uniapp 获取用户信息权限失败;无法通过wx.getUserInfo与<button open-type=“getUserInfo“/>获取用户个人信息
- Python+Appium实现京东双十一自动领金币
- Matlab龚珀兹曲线模型预测,第三章 趋势曲线模型预测法.ppt
- adaboost.M1与adaboost.M2差别比较
- HC32_HC32F072FAUA_从零开始搭建空工程模板