SMC
SMC(Self-Modifying Code,自修改代码) 是一种程序在执行过程中修改自身指令的技术
原理
程序运行时,动态修改内存中代码段的机器码,然后跳转到修改后的地址执行。修改方式包括:
异或(XOR) — 用密钥异或加密代码段,运行时解密
加减常量 — 对指令字节增减固定值
直接覆写 — 用预先准备好的原始字节替换
实战案例
jocker(SMC 逆向 + IDA 脚本)

IDA 反编译发现对 Str 和 Destination 进行了操作
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
最后输出 flag 的校验是由 encrypt 函数决定
反编译这个函数报错,这是 SMC 解密前的密文被 IDA 强行当作指令反汇编的结果
proc far、sp-analysis failed、异常的 retf 和大量无意义指令都是明显特征,不需要继续分析这些乱码

回头看 main 函数的这段代码
1 | for ( i = 0; i <= 186; ++i ) |
找到 encrypt 的具体地址

因此需要处理
1 | 起始地址:0x401500 |
1 | import ida_auto |
点击脚本文件导入进去

解密出正确的指令

1 | // 验证输入前 19 字符:与 "hahahaha_do_you_find_me?" 异或后等于硬编码数组 |
查看 0x403040 处的数据,然后写脚本反推
1 | buffer = b"hahahaha_do_you_find_me?" |
得到 b'flag{d07abccf8a410c'
回到 main(),程序检查输入长度为 24 字节,还少了 5 字节
在 finally 函数中看到字符串 %tp&: 刚好是 5 字节

假设 ':' XOR key = '}',则 key 为 0x47
1 | cipher = b"%tp&:" |
得到 b'b37a}'
拼接得到 flag{d07abccf8a410cb37a}