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运行有关的工具

  1. apt-get update #为了更新下载源
  2. apt install qemu-user-static qemu-system-mips # 安装

image.png

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这条命令之后:
image.png

如果运行qemu
安装apt-get install qemu
image.png
image.png

3.4、安装gcc-mips-linux-gnu

该工具为mips交叉编译工具,且只能编译c程序,不能编译cpp程序,如果需要完整的交叉编译工具链,需要buildroot
gcc-mips-linux-gnu 是一个能够编译mips-linux架构应用程序的编译器,之所以之前大篇幅讲GNU,是因为该编译工具名字含有gnu,代表了该软件协议也是gnu

  1. apt-get install gcc-mips-linux-gnu

image.png

  1. The following additional packages will be installed:
  2. binutils-mips-linux-gnu
  3. ncpp-5-mips-linux-gnu
  4. ncpp-mips-linux-gnu
  5. gcc-5-cross-base-ports
  6. gcc-5-mips-linux-gnu
  7. gcc-5-mips-linux-gnu-base
  8. libatomic1-mips-cross
  9. libc6-dev-mips-cross
  10. libc6-mips-cross
  11. libgcc-5-dev-mips-cross
  12. libgcc1-mips-cross
  13. libgomp1-mips-cross
  14. linux-libc-dev-mips-cross
  15. Suggested packages:
  16. binutils-doc
  17. gcc-5-locales
  18. cpp-doc
  19. gcc-5-multilib-mips-linux-gnu
  20. gcc-5-doc
  21. libgcc1-dbg-mips-cross
  22. libgomp1-dbg-mips-cross
  23. libitm1-dbg-mips-cross
  24. libatomic1-dbg-mips-cross
  25. libasan2-dbg-mips-cross
  26. liblsan0-dbg-mips-cross
  27. libtsan0-dbg-mips-cross
  28. libubsan0-dbg-mips-cross
  29. libcilkrts5-dbg-mips-cross
  30. libmpx0-dbg-mips-cross
  31. libquadmath0-dbg-mips-cross
  32. autoconf
  33. automake
  34. libtool
  35. flex
  36. bison
  37. gdb-mips-linux-gnu
  38. gcc-doc
  39. The following NEW packages will be installed:
  40. binutils-mips-linux-gnu/
  41. cpp-5-mips-linux-gnu/
  42. cpp-mips-linux-gnu/
  43. gcc-5-cross-base-ports/
  44. gcc-5-mips-linux-gnu/
  45. gcc-5-mips-linux-gnu-base/
  46. gcc-mips-linux-gnu
  47. libatomic1-mips-cross/
  48. libc6-dev-mips-cross/
  49. libc6-mips-cross/
  50. libgcc-5-dev-mips-cross/
  51. libgcc1-mips-cross/
  52. libgomp1-mips-cross/
  53. linux-libc-dev-mips-cross/

装完这个之后会有这些东西:
mips-linux-gnu-gcc是通过这条命令安装的
image.png
安装之后软件存放在这里:
image.png
任意打开终端,如果输入mips并按下tab键出现这些命令,则说明mips的交叉编译环境已经搭建成功
image.png

3.5、编译一个helloworld

  1. #include<stdio.h>
  2. int main(){
  3. printf("hello world\n");
  4. return 0;
  5. }
  1. mips-linux-gnu-gcc -static hello.c -o hello

image.png

3.6、运行helloworld

如果我们安装的是qemu-user-static,则运行下图中第一条命令;如果安装的是qemu则运行下图中第二条命令
image.png
在这里我发现一个很有意思的现象,虽然hello是mips架构的程序,但是直接运行还是会成功
image.png

3.7、运行dir605l这个路由器固件中的ls命令

如何用binwalk解包路由器固件:https://www.yuque.com/hackdoors/dcilgi/ya2elt
路径如下:
image.png

为什么要区分以下两种qemu运行环境

在上文中我们就提到这两种方式有些许不同,我们通过对比两种安装方法安装之后的文件对比也发现不同,运行方式也有不同

如果是apt install qemu-user-static

参考:https://blog.csdn.net/Homewm/article/details/102984657
image.png
执行bin下的ls命令
image.png

我们需要找到通过qemu-user-static安装的qemu-mips-static,然后拷贝到路由器的根目录中
image.png

如果是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选择解析器的工具