首页
社区
课程
招聘
[分享]2025签到题 (MCP+IDA)
发表于: 2025-8-15 12:48 261

[分享]2025签到题 (MCP+IDA)

2025-8-15 12:48
261

PS:该逆向方法长期使用会变笨,当前文章也是gpt-5生成的,全程用了不到5min。排版都不用花心思适合零基础逆向人员食用~


目标

  • 从 Windows PE 可执行文件 checkin.exe 中逆向出“签到口令”。
  • 以 MCP 驱动 IDA 的自动化操作为主线,复盘完整分析过程,深入校验逻辑与输入处理原理。




工具链与样本信息

  • 静态分析:IDA Pro(通过 MCP API 驱动)
  • 样本:/home/administrator/Desktop/CTF/kctf2025_checkin/checkin.exe
  • PE 元信息(MCP 查询):
  • base0x140000000
  • size0xdf000
  • md5dd790a4bfa88f0aa1c3cda750f6efe54


样本中含有大量 Rust 标准库字符串与 Windows CRT/MinGW 运行时符号,但主业务逻辑很小、清晰可独立抽取。




MCP × IDA 工作流要点


  • 连接与元数据:确认已连接 IDA,拉取样本路径、基址等元数据。
  • 入口点识别:入口为 start0x140001400),TLS 回调若干(与业务无关)。
  • 字符串情报速览:直接命中中文提示文本:
  • 欢迎语: “Welcome to KCTF 2025!”
  • 输入提示: “请输入签到口令: ”
  • 失败提示: “签到失败!”
  • 成功提示: “签到成功!FLAG: ”
  • 交叉引用与主流程
  • start → sub_140001010 → sub_140001AF0 → sub_140001620
  • 最终在 sub_140001620 中完成输入读取、UTF-8 空白规约(trim),并将裁剪后的 (ptr,len) 交给校验函数。






主执行流(反编译导读)



1) 程序入口与主调度

  • start 仅做初始化后跳转 sub_140001010
  • sub_140001010 设置异常过滤、CRT 初始化,最后用:
  • sub_140001AF0(argc, argv) 作为“主程序”。
  • sub_140001AF0 将真正的业务函数设为回调表(下标 0):sub_140001620,并通过一个调度器(sub_140024DA0)调用。


即:Input/Output + 检查流程全部在 sub_140001620 内。


2) 业务核心:输入处理与结果输出(sub_140001620

  • 开始打印欢迎词与输入提示(通过 sub_140031F30 + 已映射的字符串表项 off_1400A10A0/off_1400A10C8 等)
  • 使用一套封装的 I/O 读取函数 sub_14002E310 + sub_14002E3A0 将输入文本读入堆缓冲:
  • 缓冲地址:lpMem
  • 长度:v28
  • 对 lpMem..lpMem+v28 执行【UTF-8 逐码点】的“前向跳过空白”和“后向跳过空白”(完整 trim!):
  • 正向扫描:跳过 leading whitespace
  • 反向扫描:跳过 trailing whitespace
  • “是否空白字符”的判定不简单 ASCII,而是:
  • 解析 UTF-8 至 Unicode 码点
  • 检查 code point 是否为空白。判定方式:
  • 针对多类范围(如 0x20xx0x30xx 等)分别处理
  • 明确处理特殊空白:U+16805760)、U+300012288)等
  • 借助一个字节表 off_1400A0AC0 来识别常见空白
  • 裁剪完成后,将 (trimmed_ptr, trimmed_len) 填入一个二元结构(v30
  • 最终调用“口令校验函数”决定路径:
  • 成功:打印“签到成功!FLAG: ”并打印用户输入
  • 失败:打印“签到失败!”


可以看到,这里虽打印“FLAG: ”,但并非返回内置 flag,而是直接打印“你输入的口令”。所以“真正的 flag”必须与内置严格比对相同。




关键校验函数


地址 0x140001560,参数为 (buf_ptr, buf_len)。逻辑是“长度+逐字节”硬比较:


bool __fastcall check_flag(const uint8_t *s, int64_t n) {
  return n == 25
      && s[0]  == 'f'
      && s[1]  == 'l'
      && s[2]  == 'a'
      && s[3]  == 'g'
      && s[4]  == '{'
      && s[5]  == 'k'
      && s[6]  == 'c'
      && s[7]  == 't'
      && s[8]  == 'f'
      && s[9]  == '_'
      && s[10] == 't'
      && s[11] == 'i'
      && s[12] == 'm'
      && s[13] == 'e'
      && s[14] == '_'
      && s[15] == 'l'
      && s[16] == 'e'
      && s[17] == 'a'
      && s[18] == 'p'
      && s[19] == '_'
      && s[20] == '2'
      && s[21] == '0'
      && s[22] == '2'
      && s[23] == '5'
      && s[24] == '}';






[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回