-
-
[分享]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 查询):
- base: 0x140000000
- size: 0xdf000
- md5: dd790a4bfa88f0aa1c3cda750f6efe54
样本中含有大量 Rust 标准库字符串与 Windows CRT/MinGW 运行时符号,但主业务逻辑很小、清晰可独立抽取。
MCP × IDA 工作流要点
- 连接与元数据:确认已连接 IDA,拉取样本路径、基址等元数据。
- 入口点识别:入口为 start(0x140001400),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 是否为空白。判定方式:
- 针对多类范围(如 0x20xx、0x30xx 等)分别处理
- 明确处理特殊空白:U+1680(5760)、U+3000(12288)等
- 借助一个字节表 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实战!
赞赏
他的文章
- [分享]2025签到题 (MCP+IDA) 262
- [原创]KCTF2023 不用BurpSuite的抓包改包思路 2019
- [30小时教你玩转CTF]2_13_sql_1100 5828
- [原创]流量分析- 中国菜刀 17747
赞赏
雪币:
留言: