sysNow's blog

异架构pwn学习入门

2025-11-17
CTF
异架构
最后更新:2025-11-17
5分钟
825字

异架构pwn学习入门

2025年浙江省大学生网络与信息安全竞赛pwn1居然考异架构?赛场上看到一度怀疑眼瞎了,比赛结束就来学异架构……

环境配置

qemu

是一种开源的虚拟机监视器和模拟器,它可以模拟多个硬件平台,包括x86、ARM、PowerPC等

由于异架构pwn题不是amd64或i386,因此需要用qemu去模拟对应架构的硬件平台

Terminal window
1
sudo apt install qemu-user

这样就可以安装user-mode的qemu,比如qemu-aarch64、qemu-mips等

gdb-multiarch

gdb-multiarch是GDB的一个扩展版本,支持多种架构的调试工具。它允许开发者在不同的处理器架构(如 ARM、x86 等)之间进行跨平台调试

Terminal window
1
sudo apt install gdb-multiarch

交叉编译工具链

交叉编译是指在一个平台上生成可以在另一个不同平台上运行的代码,比如我们是amd64的机器,需要编译出mips架构的程序就需要mips编译工具链

Terminal window
1
sudo apt install gcc-mips-linux-gnu

mips可以改成其它的架构名字

安装gcc-mips-linux-gnu时会自动安装mips的运行环境 没有运行环境怎么编译呢,安装目录在/usr/mips-linux-gnu

测试一下

1
#include <stdio.h>
2
int main()
3
{
4
char a[10];
5
read(0, a, 10);
6
printf("Hello World !\n");
7
return 0;
8
}
9
// test.c

我们将其使用交叉编译链编译成动态链接的mips文件

Terminal window
1
mips-linux-gnu-gcc -g -o test test.c

随后就可以用qemu运行这个程序

Terminal window
1
qemu-mips -L /usr/mips-linux-gnu ./test

由于是动态链接的程序,所以要用-L参数指定运行库

default

可以看到程序正常执行

若想编译成静态链接的程序,则可以使用如下指令

Terminal window
1
mips-linux-gnu-gcc -g -static -o test test.c

此时qemu就可以省略-L参数

Terminal window
1
qemu-mips ./test

default

gdb调试

在qemu执行可执行文件时指定gdb调试端口为1234

Terminal window
1
qemu-mips -L /usr/mips-linux-gnu -g 1234 ./test

在第二个终端中使用如下指令启动gdb-multiarch

Terminal window
1
gdb-multiarch ./test

随后在gdb中输入如下指令就可以连上qemu

Terminal window
1
target remote :1234

default

pwntools交互

为了直观显示,我修改源代码如下

1
#include <stdio.h>
2
int 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用来启动进程

1
from pwn import *
2
3
context(os="linux",arch="mips",log_level="debug",endian='big')
4
5
# io = process(["qemu-mips", "-L", "/usr/mips-linux-gnu", "-g", "1234", "./test"])
6
io = process(["qemu-mips", "-L", "/usr/mips-linux-gnu", "./test"])
7
8
io.recvuntil(b"Now connect me!")
9
io.send(b"AAAA")
10
11
io.interactive()

由于pwntools中默认为小端序,因此需要在context中设置endian的值为big,这样asm和p32等函数才会按照大端序来返回数值

配置过程中出现的疑问

为什么mips二进制可执行文件在环境安装完后可以直接执行?

default

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

default

内核自动执行mips-binfmt-P解释器,由mips-binfmt-P加载qemu-mips等模拟器

为什么之前checksec无法正常查看保护,现在可以正常查看了?

default

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

本文标题:异架构pwn学习入门
文章作者:sysNow
发布时间:2025-11-17