渗透篇23-缓冲区溢出实战_Linux_Crossfire

------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:到此成功溢出;

























猜你喜欢

转载自blog.csdn.net/qq_38055050/article/details/80382752