MIPS架构下缓冲区溢出实战(IDA版)
Posted Neil-Yale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MIPS架构下缓冲区溢出实战(IDA版)相关的知识,希望对你有一定的参考价值。
我们先分析源代码大概掌握程序流程,之后通过IDA调试找到具体偏移,最后配合MIPSROP插件组合有用的指令进行利用。
学习了《mips基础》实验后,我们来进行缓冲区溢出实战吧。
源码在vuln_system.c里
通读后,可以知道逻辑很简单,就是从文件paswd中读取密码,如果密码为adminpwd则调用system执行系统命令ls –l,否则提示报错后退出
编译
注意到源程序里main中的buf大小为256字节,我们这里直接写600个A到passwd,看能否溢出,能否劫持pc
尝试执行,报错了
配合ida动态调试
f9执行,报错
点击ok后可以看到崩溃现场
接下来我们需要确定偏移,使用随机生成字符的脚本生成600字节到passwd
再次附加调试
可以看到pc值为6e37416e,即字符串n7An
根据字符串找到偏移
也就说填充412字节后可以劫持pc,412对应16进制为0x19c,我们先用BBBB测试
ida进行动态调试
可以看到我们成功使pc指向了0x42424242,也就是BBBB
在任务三里我们将会使用到ROP技术,具体技术可以学习实验室开设的课程《
高级栈溢出技术—ROP实战》(http://www.hetianlab.com/cour.do?w=1&c=CCID31b0-fe03-4277-8e2f-504c4960d33f)
接下里进入攻击阶段了。我们这里通过构造合适的ROP chain来利用。关于ROP的具体技术可以去学习实验室相关课程。
先要明确,我们最后的目的是什么,我们最终的目的是跳到do_system_0函数,执行命令。
之前在源码中看到:
传入两个参数,执行的ls –l作为第二个参数传入。正常情况下,buf内容校验正确则执行。我们站在攻击者的角度来思考,是否能够控制第二个参数,这样就能达到任意命令执行的效果了。
根据mips的传参约定,第二个参数使用
a
1
进
行
传
递
,
所
以
只
要
将
a1进行传递,所以只要将
a1进行传递,所以只要将a1传入命令字符串地址即可。
接下来使用misprop插件
如果不熟悉用法可以使用下图的命令进行查看
我们这里直接找到合适的指令
找到了一个可以构造的地址0x401f80
由var_40=-0x40,var_4=-4,可得实际上图中的两句汇编等价于
addiu
a
1
,
a1,
a1,sp,0x18
lw $ra,0x54
接下来再找到要跳转的do_system_0的地址为0x400370
综上,可以构造passwd了。
填充A一直到0x19C(412字节),然后填入0x401f80(gadget起始地址,pc会被劫持为该地址),填充0x18个A,然后填入命令字符串(根据addiu
a
1
,
a1,
a1,sp,0x18),再经过0x54的填充,写入do_system的地址0x400370,然后就可以实现任意命令执行了
完整的脚本在exp.py
注意需要把下图两个地址改为gadget起始地址和do_system地址
填充passwd
执行,成功利用了该漏洞达到了命令执行的效果
参考:
- MIPS Instruction Reference
http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html - 《揭秘家用路由器0day漏洞挖掘技术》
以上是关于MIPS架构下缓冲区溢出实战(IDA版)的主要内容,如果未能解决你的问题,请参考以下文章