在分析智能硬件的固件时,时常会面对一些搭载了文件系统的。假设我们获得了Linux kernel ARM boot executable (little-endian)格式的zImage,怎样提取出待分析的主程序呢?
第一类:
除有zImage外,还获得了ext2/ext3文件系统,且用010editor在ex2/ext3文件可以搜索到相关的关键字。可运行Explore2fs提取ext2/ext2文件系统中的文件。
注:Explore2fs无法在win7、win10运行。可以考虑运行在win XP。
第二类:
仅有zImage文件,此时可用binwalk提取程序。
binwalk -Me zImage
题外话
当初从网上看到了此篇文章,演示怎样解压linux内核
按照该方法操作了,仍然找不到主程序。
root@ubuntu:~/ctf/hw2#arm-linux-gnueabi-objdump-EL -b binary -D -m armv5t zImage | grep 8b1f //搜索gzip头部
462c: 00088b1f andeq r8, r8, pc, lsl fp
59d8: b548b1fc strblt fp, [r8, #-508] ; 0xfffffe04
13078: fce28b1f stc2l 11, cr8, [r2], #124 ; 0x7c
14b1c: 8b1f7159 blhi 0x7f1088
15aac: ae08b1f1 mcrge 1, 0, fp, cr8, cr1, {7}
34d9c: 138b1f85 orrne r1, fp, #532 ; 0x214
43b3c: 72ef8b1f rscvc r8, pc, #31744 ; 0x7c00
4dfa0: 23db8b1f bicscs r8, fp, #31744 ; 0x7c00
5cf34: 788b1fa8 stmvc fp, {r3, r5, r7, r8, r9, sl, fp, ip}
。。。。。。
root@ubuntu:~/ctf/hw2# dd if=zImage
of=out.gz bs=1 skip=17964 // 0x462c = 17964
4131028+0 records in
4131028+0 records out
4131028 bytes (4.1 MB, 3.9 MiB) copied, 6.07096 s, 680 kB/s
root@ubuntu:~/ctf/hw2# ls
out.gz to_attacker versatile-pb.dtb zImage
root@ubuntu:~/ctf/hw2#file out.gz
out.gz: gzip compressed data, max compression, from Unix
root@ubuntu:~/ctf/hw2#gunzip out.gz
gzip: out.gz: decompression OK, trailing garbage ignored
后来联系上下文和相关背景知识,明白了上述操作仅从zImage中获取了解压后的内核,还需继续提取才能获得主程序。