BootJacker: The AVR Bootloader Hack O网页链接 本文作者当时正在基于 Atmel AVR 单片机制作 8 位计算机。由于开发原因,他希望能在主程序动态修改 bootloader 的代码,然而这是不可行的——覆写 bootloader 的代码需要使用 SPM 指令,而为了防止主程序失控破坏 bootloader,SPM 是不允许在主程序的地址空间执行的。

于是作者就开始研究:有没有可能绕过保护,黑了单片机。首先他发现,虽然主程序不允许执行 SPM 指令,但是主程序是可以 jmp 到 bootloader 的,而 bootloader 自己一定有 SPM 指令。这样,他就能利用 bootloader 里现有的 SPM 指令串任意覆写 bootloader,就像是 ROP 攻击里 return-to-libc 的 gadget 一样。然而问题是,虽然可以跳到 bootloader 中的 SPM 指令,但程序在此后会失去控制,自然会一直往下执行下去,并很快执行到无关指令导致系统崩溃。这可怎么办呢?

作者将一个定时器的 PLL 设置成和 CPU 时钟完全相同的频率,这样每个时钟周期 CPU 都会收到定时器中断。然后作者写了一个定时器中断例程。在其中,作者在其中计算 CPU 跳转到 bootloader 之后执行每条指令所需要的时钟周期,从而推断出当前 CPU 之前正在执行的代码。当 CPU 执行完最后一条他想要执行的指令后,定时器中断例程会作出判断,并还原寄存器和栈,跳转回主程序并恢复原先程序的运行!太疯狂了……
欢迎新用户
o p

正在加载,请稍候...