在qemu中调试RISC-V

有时通过qemu调试RISC-V指令集的程序还是挺有趣的,qemu-system-riscv32可以选择几个机型,一般使用的最多的是virt

这是一个不对应任何真实硬件的平台,专为在虚拟机中使用而设计。virt需要使用合适的配置编译Linux,以便在开发virt板上运行。virt支持PCI、virtio、最新的CPU和大RAM。它还支持 64 位 CPU。

调试Linux不是太难,但调试bare metal program就不那么容易了。比如我在hackgame-2022-wp中记录的:

qnum模拟器固件加载在0x1000处,并且默认将elf加载到0x80000000,通过0x1014处的指令跳转到0x80000000,但是通过反汇编bootloader,我们可以看到,elf本来加载的地址应该是0x20001000。

也就是说,如果真实硬件并非将二进制加载到0x80000000,并且二进制运行依赖正确的基址,就需要在gdb中手动将二进制restore到正确的内存地址中,以便二进制中的偏移正确解析。还需要对0x1014的指令进行patch,跳转到正确的地址。

简单记录一下,没了。

Author

lyq1996

Posted on

2023-01-05

Updated on

2023-01-05

Licensed under

Comments