把MSP430核心指令集落到MSP430核心指令集的触发条件、可观察状态和复查材料上,先判断问题从哪里收窄。
MSP430核心指令集落地前要同时核对MSP430核心指令集的数据传送、失败路径和算术逻辑指令。
MSP430核心指令集用MSP430核心指令集、数据传送、算术逻辑指令连接到MSP430核心指令集的调试、验证和交付动作。
在MSP430单片机固件逆向工程中,数据传送与算术逻辑指令是最频繁出现的操作码。理解MOV、ADD、SUB等指令的二进制编码结构及其执行行为,是定位关键变量、还原算法逻辑和识别固件边界的前提。本节将围绕这三条核心指令,拆解其机器码格式、寻址模式组合以及执行周期中的典型陷阱
逆向MSP430固件时,MOV指令的编码模式直接暴露了操作数来源(寄存器/内存/立即数),而ADD与SUB的进位/借位标志位(C、V、N、Z)是判断循环边界和条件分支的“信号灯”
MSP430的MOV指令(操作码0x4xxx)采用双操作数格式,其二进制编码中的源操作数(src)和目标操作数(dst)各占4位,分别指定寄存器编号或寻址模式。逆向分析时,需要重点关注以下三种常见编码变体:
0x45 0x08,其中0x4为操作码,5和8分别对应源、目标寄存器。这是最简单的数据搬移,常用于函数参数传递0x40 0x36 0x34 0x12。注意MSP430是小端序,立即数0x1234在指令流中先出现低字节0x34,再出现高字节0x12。逆向时若看到0x40后跟0x3x,应立即识别为立即数加载0x44 0x07。源操作数@R4表示从R4指向的内存地址读取数据,常用于指针解引用在固件逆向中,MOV指令的步骤(即指令执行后的状态变化)决定了数据流的走向。例如,MOV #0x00, &0x0200会将立即数0写入外设控制寄存器,这通常是初始化或复位动作的信号
在IDA Pro或Ghidra中,对MSP430固件进行反汇编后,优先筛选所有MOV指令中目标操作数为&0x0200-0x025F(通用I/O寄存器地址范围)的条目,这些位置往往是固件与外设交互的“枢纽”
ADD(操作码0x5xxx)和SUB(操作码0x8xxx)指令的编码结构与MOV类似,但执行后会影响状态寄存器(SR)中的进位(C)、溢出(V)、零(Z)和负(N)标志位。这些标志位是后续条件跳转指令(如JNZ、JC)的判断依据,因此还原算法时必须追踪标志位的变化
以ADD #0x0001, R10(编码0x50 0x3A 0x01 0x00)为例,执行后若R10原值为0xFFFF,则结果0x0000并置位C标志(进位)。逆向时若看到ADD后紧跟JNC(无进位跳转),即可判断该段代码正在处理无符号数加法溢出。对于SUB指令,其行为等价于ADD加上补码,但标志位C在减法中表示借位(Borrow),即SUB后C=0表示发生借位
在逆向过程中,容易将ADD和SUB的溢出标志(V)与进位标志(C)混淆。V标志仅在有符号数运算中有效,表示结果超出了有符号数的表示范围(-32768~32767);而C标志用于无符号数运算。判断固件中变量是有符号还是无符号类型,需要观察其后续使用的跳转指令:若使用JN(负跳转)或JGE(大于等于跳转),则变量很可能是有符号类型;若使用JC或JNC,则是无符号类型
不要仅凭ADD或SUB指令本身判断变量类型。必须结合其后的条件跳转指令(如JN vs JC)以及上下文中的比较指令(CMP)来综合推断
复查MSP430核心指令集时,可以先问一个简单问题:如果只保留指标对照卡和关键对象,别人能不能判断操作已经完成。答案不清楚时,优先补核心指令集与上下游对象的关系,避免把异常归因到模糊的环境差异。下一次执行前先对照关键对象,确认对象、参数、套用条件和输出没有偏离,再决定继续推进还是回到前置条件。复盘顺序可以固定为MSP430核心指令集、核心指令集、关键对象三步,但每一步都要回到命令核对的当前条件,确认结论没有被旧场景带偏。第04节留下的风险提示是现场判断不要脱离命令核对单独判断,否则容易把现象误当成原因。