标题: 针对裁减版U-Boot进行逆向工程完成Flash读写的一般思路 创建: 2018-11-15 10:15 更新: 2018-11-15 13:47 链接: https://scz.617.cn/misc/201811151015.txt 为了读写固件,传统搞法是将Flash焊下来,放到编程器上,插电脑上读写。编程器 是芯片相关的,不同的Flash芯片需要不同编程器。有时可能想修改固件,就得焊来 焊去。这次由于各种原因,未能给目标设备实现拔插式外接Flash基座,每次只能进 行赤裸裸的焊接操作,使得修改固件极不方便。 把串口接出来,一般有提示按某组合键进入U-Boot。U-Boot提示符下很多命令不一定 都能用,而且碰上裁减版U-Boot,很可能没有读写Flash的命令。 U-Boot有自己的环境变量,也叫U-Boot参数,有相应命令查看、修改、保存之。注意 到保存环境变量时会在串口上显示其正在擦写Flash,这说明U-Boot包含了擦写Flash 的代码,只是没有通过可用命令的形式提供这种能力,厂商有想法呗。 我开了个脑洞,利用U-Boot已有命令动态Patch U-Boot,弄一段shellcode进去,完 成擦写Flash。下面说一下基本思路: 1) 定位U-Boot在内存中的加载基址,IDA逆向分析U-Boot,修改基址 2) 在IDA中识别C运行时库函数,比如memcpy、strcmp、printf等等 3) 定位现有U-Boot命令对应的函数,确保执行A命令时必经A函数 4) 定位U-Boot中完成Flash擦写的内部函数 5) 编写shellcode,调用U-Boot内部函数实现Flash擦写 6) 按组合键进入U-Boot,利用现有U-Boot命令在内存中准备好待写入固件 7) 利用现有U-Boot命令动态Patch A函数,注入shellcode 8) 在U-Boot提示符下执行A命令,触发Patch过的A函数,完成Flash擦写 其中第5步借助bluerust提供的kstoolex,参看: 《利用Keystone快速汇编并提取机器码》 https://scz.617.cn/misc/201811071803.txt 事实上其原始需求正是本文第5步。好了,就这么多,思路很简单,说穿后一钱不值。