异构 PWN 0x1 环境搭建

异构 PWN 0x1 环境搭建

最近一个月各种干活,没能抽出固定的时间来学习 ) :

之前学习的笔记比较零散,最近准备抽时间全部整理到博客上

本文内容是异构环境的搭建和使用,参考了A1ex的博客

https://a1ex.online/2020/10/09/mips-pwn%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/

环境搭建

QEMU安装

1
2
3
4
5
sudo apt-get install qemu 
sudo apt-get install qemu-user-static
sudo apt-get install qemu-system
sudo apt-get install uml-utilities
sudo apt-get install bridge-utils

IDA mipsrop插件

一款用于搜索mips中gadgets和function call的插件,下载地址如下

https://github.com/devttys0/ida/tree/master/plugins/mipsrop

但实际上该版本的mipsrop插件并不能在7.0中使用,需要下载旧版

image-20201111230420992

Ghidra

NASA发布的逆向神器,支持mips的反编译,在主机上配置好java环境即可使用

MIPS汇编指令学习

https://www.cnblogs.com/CoBrAMG/p/9237609.html

QEMU系统模式

暂略

https://a1ex.online/2020/10/09/mips-pwn%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/

之前配置过,但目前用的比较少,听征哥说可以利用bulitroot直接编译出其他架构的linux内核,但还没来得及深入研究,等学习到linux内核再看吧

QEMU用户模式

运行程序

  • 用户模式配置更简单,也更常用,这里以32位mipsel程序为例,可以看到除了程序外还有其依赖的.so文件

    image-20201111233038787

    此时有三种方法可以运行程序

1. 修改系统根目录

既然题目已经给了程序所依赖的库,那么我们直接将系统的根目录设定到题目所在目录,即可解决依赖问题

qemu的用户模式分为qemu-userqemu-user-static, 其中后者是静态编译的, 本身不需要其他依赖库, 因此可以在此处使用(因为修改了系统根目录后原本的依赖会失效)

修改系统根目录可以通过chroot命令实现, 具体指令如下

sudo chroot . ./qemu-mipsel-static HelloMIPS[需要提前将 qemu-mipsel-static放置在程序目录中]

2. 手动将依赖库放置到指定位置

直接运行程序时,往往会出现以下错误信息

image-20201111235432037

我们只需要将题目所给的依赖库放入/lib/中,并修改为其指定的名字即可执行

3. 指定依赖库路径

通过qemu-L参数指定程序依赖库的路径

$ qemu-aarch64 -L . HelloARM

image-20201112001659894

调试程序

调试程序同样有三种方式,这里强推第三种

1. 使用socat挂载

使用socat命令挂载程序

socat tcp-l:10002,fork exec:"qemu-mipsel -g 1234 -L . ./HelloMIPS",reuseaddr

此时10002为pwntools的端口

1234为gdb的端口

在调试时,在pwntools脚本中加一个pause让程序暂停,紧接着打开gdbgdb-multiarch HelloMIPS

之后使用指令target remote 127.0.0.1即可连上程序进行调试

image-20201112002446047

如果出现端口占用的情况, 需要通过指令杀死socat进程

killall socat

2. 在PWNTOOLS中使用指令挂载

第一种方法本质上是开了两个端口,一个用于pwntools脚本,一个用于gdb

但这样需要开3个终端,太麻烦了

因此我们直接在pwntools脚本中执行qemu-mipsel -g 1234 -L . ./HelloMIPS,然后 在通过gdb本地连接上, 这样只需要两个终端即可

代码如下:

1
p = process(["qemu-mipsel", "-g", "1234","./HelloMIPS"])

之后步骤同1一样

3. 在PWNTOOLS中通过gdb.debug的方法调试

第二种方法实际上已经比较完美了,但美中不足的是, 我们需要在脚本的开头设置一个pause, 然后在手动操作gdb连上去, 还是有点麻烦

有没有一种方法可以把这个过程自动化呢,其实是有的,其代码如下:

1
2
3
context.binary = 'HelloMIPS'
context.terminal = ['tmux','splitw','-h']
p = gdb.debug(context.binary.path)

使用时和以上两种方法类似


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!