异架构pwn学习入门
2025年浙江省大学生网络与信息安全竞赛pwn1居然考异架构?赛场上看到一度怀疑眼瞎了,比赛结束就来学异架构……
环境配置
qemu
是一种开源的虚拟机监视器和模拟器,它可以模拟多个硬件平台,包括x86、ARM、PowerPC等
由于异架构pwn题不是amd64或i386,因此需要用qemu去模拟对应架构的硬件平台
1sudo apt install qemu-user这样就可以安装user-mode的qemu,比如qemu-aarch64、qemu-mips等
gdb-multiarch
gdb-multiarch是GDB的一个扩展版本,支持多种架构的调试工具。它允许开发者在不同的处理器架构(如 ARM、x86 等)之间进行跨平台调试
1sudo apt install gdb-multiarch交叉编译工具链
交叉编译是指在一个平台上生成可以在另一个不同平台上运行的代码,比如我们是amd64的机器,需要编译出mips架构的程序就需要mips编译工具链
1sudo apt install gcc-mips-linux-gnumips可以改成其它的架构名字
安装gcc-mips-linux-gnu时会自动安装mips的运行环境 没有运行环境怎么编译呢,安装目录在/usr/mips-linux-gnu
测试一下
1#include <stdio.h>2int main()3{4 char a[10];5 read(0, a, 10);6 printf("Hello World !\n");7 return 0;8}9// test.c我们将其使用交叉编译链编译成动态链接的mips文件
1mips-linux-gnu-gcc -g -o test test.c随后就可以用qemu运行这个程序
1qemu-mips -L /usr/mips-linux-gnu ./test由于是动态链接的程序,所以要用-L参数指定运行库

可以看到程序正常执行
若想编译成静态链接的程序,则可以使用如下指令
1mips-linux-gnu-gcc -g -static -o test test.c此时qemu就可以省略-L参数
1qemu-mips ./test
gdb调试
在qemu执行可执行文件时指定gdb调试端口为1234
1qemu-mips -L /usr/mips-linux-gnu -g 1234 ./test在第二个终端中使用如下指令启动gdb-multiarch
1gdb-multiarch ./test随后在gdb中输入如下指令就可以连上qemu
1target remote :1234
pwntools交互
为了直观显示,我修改源代码如下
1#include <stdio.h>2int main()3{4 puts("Now connect me!");5 char a[10];6 read(0, a, 10);7 printf("Hello World !\n");8 return 0;9}将其编译,二进制文件名为test
我们可以写出如下程序与可执行文件交互,需要调试时就选择注释掉的语句启动process并手动连接进程
嫌麻烦的话也可以直接写一个start.sh用来启动进程
1from pwn import *2
3context(os="linux",arch="mips",log_level="debug",endian='big')4
5# io = process(["qemu-mips", "-L", "/usr/mips-linux-gnu", "-g", "1234", "./test"])6io = process(["qemu-mips", "-L", "/usr/mips-linux-gnu", "./test"])7
8io.recvuntil(b"Now connect me!")9io.send(b"AAAA")10
11io.interactive()由于pwntools中默认为小端序,因此需要在context中设置endian的值为big,这样asm和p32等函数才会按照大端序来返回数值
配置过程中出现的疑问
为什么mips二进制可执行文件在环境安装完后可以直接执行?

因为安装qemu时进行了数段binfmt_misc配置

内核自动执行mips-binfmt-P解释器,由mips-binfmt-P加载qemu-mips等模拟器
为什么之前checksec无法正常查看保护,现在可以正常查看了?

虽然checksec的本质是读文件,但是之前系统缺乏MIPS工具链就会导致无法识别ELF文件,现在补齐了工具链就能正常识别了