1、qemu user介绍
QEMU是一个处理器模拟软件,可以用来在PC中模拟ARM、MIPS等多种架构的软硬件运行环境。QEMU主要有两种模拟模式:
System Mode
System模式中,它可以虚拟多种CPU架构的虚拟计算机系统,比如可以在x86 的 Ubuntu系统中虚拟出一个MIPS架构的Debian系统。
User Mode
User模式中,它可以运行为其他处理器编写的应用程序,比如可以在X64 Ubuntu系统中直接运行 MIPS Linux的应用程序。
QEMU功能强大,安装起来也很简单。在Ubuntu版本,只需要一条命令就可以把QEMU(本次博客涉及的安装文件)安装好.QEMU 其他架构的软件包这里没有涉及就没安装。
2、安装mips运行有关的工具
apt-get update #为了更新下载源
apt install qemu-user-static qemu-system-mips # 安装
3、QEMU User模式的使用
安装好qemu后,我们可以用mips编译器交叉编译一个小得C demo应用程序并运行起来。在此之前我们需要安装一个能够编译mips应用程序的编译器。同样使用一条简单的命令就可以完成
3.1、开源协议
BSD
(original BSD license、FreeBSD license、Original BSD license):可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布
注意:
1. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
Apache Licence 2.0
(Apache License, Version 2.0、Apache License, Version 1.1、Apache License, Version 1.0):允许代码修改,再发布(作为开源或商业软件)
注意:
1. 需要给代码的用户一份Apache Licence
2. 如果你修改了代码,需要再被修改的文件中说明。
3. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
MIT
(MIT):
MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制
GPL
(GNU General Public License):
遵循 GPL 的软件进行任何改动和/或再次开发并予以发布,则您的产品必须继承 GPL 协议,不允许封闭源代码
LGPL
(GNU Lesser General Public License):
遵循 LGPL 的软件进行任何改动和/或再次开发并予以发布,则您的产品必须继承 LGPL 协议,不允许封闭源代码。但是如果您的程序对遵循 LGPL 的软件进行任何连接、调用而不是包含,则允许封闭源代码。
3.2、GNU
GNU是一个自由的操作系统,其内容软件完全以GPL方式发布。“GNU”是“GNU’s Not Unix!”(GNU并非Unix!)的首字母递归缩写。
3.3、mips运行环境和编译环境
1、首先需要明白,apt install qemu-user-static qemu-system-mips安装qemu用户模式和系统模式是提供其他架构应用程序的运行环境(这两条命令只安装了静态用户模式模式的qemu和mips系统模式,通过apt-get install qemu可以按照更多的运行环境包括arm等)
2、而交叉编译环境需要buildroot(可以编译mips架构及其它架构的交叉编译器、类库)进行编译,当然也可以直接下载mips编译器
安装完apt install qemu-user-static qemu-system-mips这条命令之后:
如果运行qemu
安装apt-get install qemu
3.4、安装gcc-mips-linux-gnu
该工具为mips交叉编译工具,且只能编译c程序,不能编译cpp程序,如果需要完整的交叉编译工具链,需要buildroot
gcc-mips-linux-gnu 是一个能够编译mips-linux架构应用程序的编译器,之所以之前大篇幅讲GNU,是因为该编译工具名字含有gnu,代表了该软件协议也是gnu
apt-get install gcc-mips-linux-gnu
The following additional packages will be installed:
binutils-mips-linux-gnu
ncpp-5-mips-linux-gnu
ncpp-mips-linux-gnu
gcc-5-cross-base-ports
gcc-5-mips-linux-gnu
gcc-5-mips-linux-gnu-base
libatomic1-mips-cross
libc6-dev-mips-cross
libc6-mips-cross
libgcc-5-dev-mips-cross
libgcc1-mips-cross
libgomp1-mips-cross
linux-libc-dev-mips-cross
Suggested packages:
binutils-doc
gcc-5-locales
cpp-doc
gcc-5-multilib-mips-linux-gnu
gcc-5-doc
libgcc1-dbg-mips-cross
libgomp1-dbg-mips-cross
libitm1-dbg-mips-cross
libatomic1-dbg-mips-cross
libasan2-dbg-mips-cross
liblsan0-dbg-mips-cross
libtsan0-dbg-mips-cross
libubsan0-dbg-mips-cross
libcilkrts5-dbg-mips-cross
libmpx0-dbg-mips-cross
libquadmath0-dbg-mips-cross
autoconf
automake
libtool
flex
bison
gdb-mips-linux-gnu
gcc-doc
The following NEW packages will be installed:
binutils-mips-linux-gnu/
cpp-5-mips-linux-gnu/
cpp-mips-linux-gnu/
gcc-5-cross-base-ports/
gcc-5-mips-linux-gnu/
gcc-5-mips-linux-gnu-base/
gcc-mips-linux-gnu
libatomic1-mips-cross/
libc6-dev-mips-cross/
libc6-mips-cross/
libgcc-5-dev-mips-cross/
libgcc1-mips-cross/
libgomp1-mips-cross/
linux-libc-dev-mips-cross/
装完这个之后会有这些东西:
mips-linux-gnu-gcc是通过这条命令安装的
安装之后软件存放在这里:
任意打开终端,如果输入mips并按下tab键出现这些命令,则说明mips的交叉编译环境已经搭建成功
3.5、编译一个helloworld
#include<stdio.h>
int main(){
printf("hello world\n");
return 0;
}
mips-linux-gnu-gcc -static hello.c -o hello
3.6、运行helloworld
如果我们安装的是qemu-user-static,则运行下图中第一条命令;如果安装的是qemu则运行下图中第二条命令
在这里我发现一个很有意思的现象,虽然hello是mips架构的程序,但是直接运行还是会成功
3.7、运行dir605l这个路由器固件中的ls命令
如何用binwalk解包路由器固件:https://www.yuque.com/hackdoors/dcilgi/ya2elt
路径如下:
为什么要区分以下两种qemu运行环境
在上文中我们就提到这两种方式有些许不同,我们通过对比两种安装方法安装之后的文件对比也发现不同,运行方式也有不同
如果是apt install qemu-user-static
参考:https://blog.csdn.net/Homewm/article/details/102984657
执行bin下的ls命令
我们需要找到通过qemu-user-static安装的qemu-mips-static,然后拷贝到路由器的根目录中
如果是apt install qemu
4、关于运行环境qemu的安装
参考:https://xuanxuanblingbling.github.io/ctf/tools/2020/04/16/qemu/
在Ubuntu中安装QEMU的网络教程中,经常有要apt安装一堆东西,其实不用指定那么多包也能安装所需要的所有qemu软件,首先来看一下网上教程中常见的软件包:
- qemu:比较完整的软件包,包括了qemu-system、qemu-user以及binfmt-support
- qemu-system:system模式的软件包,模拟完整的系统
- qemu-user:user模式的软件包,本身是动态链接
- qemu-user-static:user模式的软件包,本身是静态链接,用于chroot更换动态路径后仍然能运行
- binfmt-support:根据二进制的magic number选择解析器的工具