------Fuzzing环境准备---------
测试软件:Crossfire 1.9.0 接受入站socket连接时存在缓冲区溢出漏洞
调试工具:edb
运行平台:kali i386
ps:32位的机器cpu地址总线的位数是2^32(最大寻址空间);相对64位系统测试 简单;
-----服务端程序
-------调试工具
ps:新版本Linux内核支持内存保护机制:DEP ALSP 堆栈cookies 堆栈粉碎
ps:但是crossfire不支持这些保护机制
------本机调试
iptables -A INPUT -P tcp --destination-port 4444 \! -d 127.0.0.1 -j DROP
iptables -A INPUT -P tcp --destination-port 13327 \! -d 127.0.0.1 -j DROP
ps:通过本机防火墙限制只能通过本机访问13327服务端口、4444侦听端口;避免测试的时候被别人利用;
------Starting Fuzzing---------
ps:在debug菜单点击两次run,运行服务器端程序;和immunity不同的是,必须双击EIP才能看到下一条指令的内存地址
----01.py----
ps:crossfire只有当发送的数据在一个固定的数值的时候才能精确修改eip内容;4379;ps:\x11表示设备调用的指令;缓冲区溢出发生在setup sound指令;\x0空字符表示crash指令结束;
ps:第五行表示建立连接对象;
ps:可见当前EIP寄存器被我们发送的A覆盖掉了;可以判断这个程序存在缓冲区漏洞
---02.py---精确定位EIP字符位
ps:可见覆盖EIP的字符是4369到4372;
---03.py---验证是否从4369开始覆盖EIP
ps:至此说明精确覆盖
ps:查看ESP内容,可以看到7个C;这7个字符不足够填充shellcode;这是一个问题;
ps:经筛选发现只有4000多个A存放在EAX里面;理论上可以写入shellcode;
ps:把EIP的地址改成EXP程序段地址;前面12个字符写setup sound ;从A开始执行shellcode;
在本机上可以执行;但是注意EXP地址和操作系统有关系;所以必须再次调整代码跳转的思路;
新思路:第一阶段shellcode->ESP跳转到EAX;偏移12个字节;
第二阶段 setup sound shellcode2
ps:汇编指令转换成二进制;偏移12个字节;
ps:跳转到eax起始位置;
ps:转换成16进制为:\x83\xc0\x0c\xff\xe0\x90\x90
----04.py---修改ESP
ps:83 e0 0c ff e0 90 90 ,被精确修改
ps:那怎么跳转到ESP呢;修改EIP的内容为ESP的内存地址行不通,因为ESP的地址也是变化的;
ps:在Windows下可以通过调用地址不变的系统模块执行jmp esp;linux下可通过类似的方法;
ps:现在可以把EIP的内容填为上诉地址,间接跳转到ESP;然后修改ESP的内容让EAX偏移12位并执行shellcode;
ps:查找坏字符,发现badcode:\x00\x0a\x0d\x20
---05.py
ps:设置断点;runing程序
ps:遇到断点pause,F8继续
ps:跳转到EAX,F8继续
ps:偏移了12个字符的其实位置;F8继续
ps:EXP里面的内容;接下来的工作是找到合适的shellcode替换前面一部分A;
ps:生成shellcode;在目标服务器开放一个端口
---06.py
ps:A*(4368-105)
ps:成功打开4444端口;
ps:到此成功溢出;