executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
(MD5-crypt)、`$5
re-mipsMIPS 架构逆向与路由器固件分析方法论:延迟槽、$gp 调用约定、大小端判断、httpd 定位。 触发词:MIPS、mipsel、路由器固件、嵌入式、延迟槽、big-endian、大端、小端、httpd、busybox
Independent GitHub snapshot · Automated classification · Original documentation governs
所有工具先验证再使用。静态分析可免沙箱;qemu-user 动态执行默认沙箱 + 网络隔离([[re-analyze/platform-tips]] 最高原则)。
apt install ghidra / pacman -S ghidrabrew install --cask ghidra;Windows: 官方 zipanalyzeHeadless -help(headless 模式)或 GUI 导入 MIPS ELFbinwalk --version、unblob --versionapt install binutils 等);macOS: brew install binutils 或 LLVM 系 readelf;Windows: WSL 内readelf --versionapt install qemu-user / dnf install qemu-user / pacman -S qemu-userbrew install qemu(含用户态);Windows/WSL: WSL 内 Linux 版qemu-mips(大端)/ qemu-mipsel(小端),64 位为 qemu-mips64 / qemu-mips64elqemu-mips --version、qemu-mipsel --versionapt install python3 / dnf install python3 / pacman -S pythonpython3 --version按顺序执行,每步结果存档;步骤 5(动态执行)默认沙箱。
前置:固件提取与架构确认:
file target.elf # 是否 MIPS + 端序提示
readelf -h target.elf # Machine=MIPS;Data=big-endian/little-endian
readelf -A target.elf | head # 子版本/ABI 附加信息
file 输出含 "MIPS" 才进入本技能流程;非 MIPS 转 [[re-binary-core]] 通用底座字节序判断(大端 / 小端):
file 输出 MSB → 大端(处理器变体 mips);LSB → 小端(mipsel)readelf -h 的 Data 字段直接给出端序;e_flags 含 ABI 信息(o32 / n32 / n64)hsqs 反序出现)反编译注意(MIPS 特有语义):
beq / bne / j / jal)后紧跟的一条指令在 taken / not-taken 两路都执行(先执行再转移控制);Branch Likely(beql / bnel / blezl / bgtzl / bltzl / bgezl 及 FP likely 类)不同——只在 taken 时执行延迟槽,not-taken 时延迟槽被 annul(跳过);beq / bne / j / jal 后常见汇编器填充的 nop 或有用的指令;补丁时分支后必须处理延迟槽(填 nop 或等价指令);MIPS32r6 删除 branch-likely、新增无延迟槽的 compact 分支形式(beqc / bnec / bc / balc / jic / jialc),但 beq / bne / jalr / jr 仍带延迟槽——按 ISA revision + opcode 分类,不能一概说 R6 取消了延迟槽jal 自动写入)、$s0-$s7 被调用者保存、$t0-$t9 调用者保存;PIC 间接调用模式 jalr $t9($t9 载入被调函数地址,函数开头常重载 $gp)lw $t0, off($gp) / addiu $t0, $gp, off;函数序言常见 lui gp, %hi(...) + addiu gp, gp, %lo(...) 重设 $gpj / jal 立即数跳转只覆盖同 256MB 段(26 位地址左移 2 位),跨段调用由编译期生成 stub 跳板(先加载地址再 jalr);看到成片 lui + addiu + jalr 三指令序列多为跳板,不要当业务逻辑路由器固件专项:
system( / popen( / exec 调用点 → 回溯参数来源是否为 URL 参数或 CGI 字段;认证常见缺陷是后端信任可客户端控制的字段(cookie、Referer、固定口令)或硬编码口令比对busybox --list,静态时找符号表中 applet 表(applet_names);单二进制内多 applet 逻辑,避免误判"一个函数处理一切"$1$(MD5-crypt)、$5$ / $6$(SHA-crypt)及自定义格式;备份配置常 base64 / gzip / 自定义打包(衔接 [[re-fw-rootfs]] 与 [[re-crypto-id]])动态验证(沙箱):
qemu-mips -L <rootfs路径> ./target # 大端;小端用 qemu-mipsel
qemu-mips -L <rootfs路径> -strace ./target # 系统调用跟踪
qemu-mips -L <rootfs路径> -E <ENV=val> ./target
-L 指定 rootfs 作为动态加载器/库来源(MIPS 程序常依赖固件内 libc 与配置)file(MSB/LSB)+ readelf -h Data 字段 + strings 可读性三重确认,导入工具选对 mips / mipsel 变体lw $t0, off($gp) 指向不明、GOT 引用解不出;原因——剥离符号/静态链后重定位丢失,$gp 值(常见 .got+0x7FF0)需自行确认;对策——在 _start / crt0 序言的 lui gp + addiu gp 处计算实际 gp 值并在反编译器中标注;无符号时按 .got 段基址推算busybox --list 或符号表 applet 表(applet_names)定位具体 applet,以对应子命令入口为分析起点