mipspwn
最近遇到的异架构的pwn题越来越多了,也是未来pwn的发展趋向,决定入坑一下,就从西湖论剑的一道mipspwn开始进入mips的世界吧:)
mips构架下的pwn和x86的pwn主要区别在于寄存器,指令集的区别。网上博客挺多的,我主要说下常见到的点(会不断补充的):
1.a0,a1,a2寄存器用来函数的传参,多的用栈传递。
2.fp类似rbp但有又不同,ret_addr在fp-4,存储上一个栈帧的位置为fp-8。sp相当于rsp。
3.mips常用shellcode的地址覆盖返回地址来拿shell。
4.qemu-user起的mipspwn题的地址是固定的(动态链接库什么的除外),且一般保护措施都没开启。
西湖论剑managesystem
mips下pwn静态分析用ghidra,ida反编译不了0.0
这题漏洞很明显:
1 | puts("Enter the index of user you want edit: "); |
这就好办了,直接unlink。
先add4次,最后一个chunk存放shellcode,然后在chunk1里构造fake_chunk同时改next_chunk的inuse位,mips下是直接size-1即可,之后dele掉chunk2,触发unlink。
效果:
1 | pwndbg> telescope 0x00411830 |
之后edit(1)来控制chunk0的指针,配合show泄露libc(用的free_got),和stack(用的env(libc里的env)环境变量指针)。
然后偏移得到ret_addr,之后edit改chunk0_ptr位ret_addr,再edit(0)改返回地址为存放shellcode的chunk地址。
exp:
1 | from pwn import * |