一定要完整安装!!
$ 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 root@192.168.84.129:/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之外还会修改文件!!造成无法运行!!
转自先知社区
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.