一定要完整安装!!
$ sudo apt-get update
$ sudo apt-get install build-essential autoconf git
$ git clone https://github.com/devttys0/binwalk.git
$ cd binwalk
# python2.7安装
$ sudo python setup.py install
# 自动安装依赖库文件
$ sudo ./deps.sh
# 提取固件 -M递归提取
$ binwalk -Me XX.bin
sudo apt-get install qemu #user mode,包含qemu-mips-static,qemu-mipsel-static,qemu-arm-static等 sudo apt-get install qemu-user-static #system mode,包含qemu-system-mips,qemu-system-mipsel,qemu-system-arm等 sudo apt-get install qemu-system
qemu有两种运行模式:
user mode : qemu-mips(mipsel/arm)-static。用户只需要将各种不同平台的处理编译得到的Linux程序放在QEMU虚拟中运行即可,其他的事情全部由QEMU虚拟机来完成,不需要用户自定义内核和虚拟磁盘等文件;
system mode:qemu-system-mips(mipsel) : 用户可以为QEMU虚拟机指定运行的内核或者虚拟硬盘等文件,简单来说系统模式下QEMU虚拟机是可根据用户的要求配置的。
用户模式下需要切换"/"目录,使用的是chroot命令,将根目录切换到binwalk提取出的文件系统目录下,例如squashfs-root,cpio-root。
在需要指定新的动态库实现一些函数的劫持时,用-E LD_PRELOAD="XX.so"
开启调试模式时,使用-g 1234
#将qemu-mips-static拷贝到当前目录下 $ sudo cp $(which qemu-mips-static) . $ sudo chroot . ./qemu-mips-static -E LD_PRELOAD="XX.so" -g 1234 bin/boa
用这个模式稍微麻烦一点点,但是能获取到的信息也比较多,比如能够查看qemu内部进程的内存分布,设备之类的情况。
1.配置网卡
参考固件模拟调试环境搭建即可,大佬写的很全了
2.启动qemu
两个镜像下载:debian
$ sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta \
-hda debian_squeeze_mips_standard.qcow2 \
-append "root=/dev/sda1 console=tty0" \
-net nic -net tap -nographic -s
参数说明:
-M 指定开发板 你能够使用-M ?參数来获取该qemu版本号支持的全部单板
-kernel 内核镜像路径
-hda/-hdb IDE硬盘镜像
-append 内核启动参数 内核命令行
-s 等同于-g 1234
3.开启qemu之后,将binwalk提取出的文件系统拷贝到虚拟机中
$ scp -r ./cpio-root [email protected]:/root/
4.接下来就可以在远端mips虚拟机上运行程序
$ export LD_PRELOAD='XX.so'
$ chroot . bin/busybox
一些固件是可以用这个软件来模拟的,但不是所有都可以,不能的还要用qemu
下载和安装:firmadyne按照这个一步一步来就OK了(懒的话可以直接下FAT)
建议如果用的是FAT,先在fat.py的setup_network函数中加入child.logfile = file("mylog.txt",w)
,要不然看不见输出的各种error和warning;
def setup_network(arch, image_id): print "[+] Setting up the network connection, please standby" network_cmd = "sudo " + firmadyne_path + "/scripts/inferNetwork.sh " + image_id + " " + arch child = pexpect.spawn(network_cmd) child.logfile = file("mylog.txt",'w')#here!!!!!!!get log child.sendline(root_pass) child.expect("Interfaces:", timeout=None) interfaces = child.readline().strip() print "[+] Network interfaces : " + interfaces child.expect(pexpect.EOF)
出现的问题:
1.firmadyne获取不到IP
按照firmadyne软件的readme一步一步执行时,sudo ./scripts/makeImage.sh 1
报错:the file /dev/mapper/loop0p1 does not exist and no size was specified。
在该脚本里,DEVICE是由get_device获取到的,get_device在firmadyne.config中
get_device () { echo "/dev/mapper/loop0p1" }
而在系统中已经有很多loop的情况下,makeImage.sh会将QEMU img挂载到loop32(例)这种数字比较大的loop上。
解决方法是在mounting之后,将kpartx挂载虚拟文件系统返回的device作为mkfs.ext2的参数,具体方法
可用在编译新的动态库,劫持程序的运行。
$ sudo apt-get install linux-libc-dev-mips-cross $ sudo apt-get install libc6-mips-cross libc6-dev-mips-cross $ sudo apt-get install binutils-mips-linux-gnu gcc-mips-linux-gnu $ sudo apt-get install g++-mips-linux-gnu
编译一个mips的gdb:mips-linux-gdb
专属于mips指令的gdb比较好用,gdb-multiarch也ok但是要在调试之前set arch mips;set endian big/little。如果用了类似pwndbg等插件出现问题,可在~/.gdbinit中注释掉各种source用纯gdb。
在Ubuntu下安装wine就可运行windows下的IDA了。
环境只需要JDK11就OK,可直接查看反编译代码,比IDA方便,但是xref这种还是要结合着IDA一起来看。
不要用ghidra patch文件!!!ghidra除了patch之外还会修改文件!!造成无法运行!!