MIPS-漏洞研究常用工具及调试方法
Binwalk
正常apt
安装的binwalk一般都是不完整的,需要我们先卸载后在github
中下载安装,之后才可以正常提取路由器的固件,否则将出现下图错误
安装binwalk
1 | git clone https://github.com/devttys0/binwalk.git |
安装sasquath
1 | sudo apt-get install mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract cramfsprogs cramfsswap squashfs-tools |
其中可能会出现sasquatch脚本的lzma
编译错误
1 | In file included from xz_wrapper.c:31:0: |
解决方法:
修改./sasquatch/squashfs4.3/squashfs-tools
中lzma.h
文件的命名
1 | cd LZMA/lzmadaptive/C/7zip/Compress/LZMA/ |
之后将其文件中include
后的文件名修改
1 | ➜ LZMA vim lzmadaptive/C/7zip/Compress/LZMA/LZMADecoder.h |
至此完成,进行编译安装
1 | sudo make clean |
调试
qemu-system GDB调试
下载各架构版本的gdbserver https://github.com/e3pem/embedded-toolkit
之后拷贝到qemu虚拟机中
1 | ./gdbserver-mips32 0.0.0.0:1234 level1 |
之后在本机的gdb中进行连接调试
1 | gdb-multiarch level1 |
qemu-user GDB调试
正常情况下单个mips的程序运行要有足够的lib库依赖,把qemu-mips-static
放到完整的路由器文件系统squashfs-root
的根目录中运行程序就可以了,即:
1 | cp $(which qemu-mipsel-static) ./ |
之后正常使用GDB或者IDA连接即可
1 | gdb-multiarch level1 |
可能出现的问题 :
./stack_bof_01: Invalid ELF image for this architecture
字节序问题,切换qemu-static的大小端版本,如小端qemu-mipsel-static
\大端qemu-mips-static
/lib/ld-uClibc.so.0: No such file or directory
由于程序可能需要某个目录下的依赖所导致
需要将qemu-mipsel-static
文件放到squashfs-root
根目录下,之后chroot ./
。(这个有时候要加./
有时候直接.
就可以)
IDA-plugins MIPSROP
安装
由于mips的特殊性:
- 在ROP过程中非常容易搞出来类似在x86上的jmp esp的指令
- mips本身不支持NX
导致shellcode in stack几乎成了mips栈溢出的通用利用方式
1 | git clone https://github.com/fuzzywalls/ida/tree/master/plugins |
常用方法
mipsrop.stackfinder() | 寻找栈数据可控的 rop,建立和 a0、a1 寄存器的关系 |
---|---|
mipsrop.summary() | 列出所有的可用 rop |
mipsrop.system() | 寻找命令执行的的rop |
mipsrop.find(xxx) | 查找 find 函数参数的 rop,类似正则匹配 |
反编译工具
Ghidra
反编译MIPS伪代码,感觉不如下面的JEB好用
ghidra_9.1.2_PUBLIC_20200212
JEB-MIPS
JEB 永远的神
JEB_Decompiler_3.19.1_Professional
链接:https://pan.baidu.com/s/1eNZiRcCfjofH-TxieFLNzw
提取码:r7e7这个注册的时候需要注意:
先运行jeb_pro,之后复制密钥输入到jebKeygen工具中生成密钥后再返回jeb输入