我有一个 ARM 可执行二进制文件,我想在精确的虚拟地址上修补它。是否有任何安全(和自动化)的方法来执行此任务?
欢迎使用任何脚本或工具!
我有一个 ARM 可执行二进制文件,我想在精确的虚拟地址上修补它。是否有任何安全(和自动化)的方法来执行此任务?
欢迎使用任何脚本或工具!
如果你在 Linux 上使用一组简单的命令作为readelf
,printf()
并且dd
可以完成这项工作。
例如,如果您有MyBin
ELF 格式的二进制文件,并且想要修补0x418966
内存中的以下条件:
jnz loc_418706 ; 0x418966: 0f 85 9a fd ff ff
首先,您必须找到有关.text
二进制文件部分的信息:
$ readelf --wide -S MyBin | grep '.text\|Name\|Off'
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[13] .text PROGBITS 0000000000414670 014670 0dfa82 00 AX 0 0 16
这里:
.text
部分在二进制文件中开始0x014670
;.text
部分加载到内存中0x414670
。然后您必须计算二进制文件中相对于该.text
部分的指令偏移量:
0x418966 - 0x414670 = 0x0042f6
0x014670 + 0x0042f6 = 0x018966
或使用外壳单衬:
$ text_addr=0000000000414670; inst_addr=418966; text_off=014670; \
python -c 'print(0x'$inst_addr' - 0x'$text_addr' + 0x'$text_off')'
100710
此处修补指令位于0x18966
二进制文件中。
最后,我用 nop 和近跳转 ( jmp e9 [cd]
)修补二进制文件。
printf '\x90\xe9' | dd of=MyBin bs=1 seek=100710 count=3 conv=notrunc