CTF 两道web整数溢出题目(猫咪银行和ltshop)

本文深入解析了两个HackGame挑战——猫咪银行和LTshop中的整型溢出漏洞。通过精心构造交易参数,如购买时间、份额及商品数量,实现了整型溢出,从而以极低成本获取高额回报或大量商品,成功完成挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

①猫咪银行: (2018中科大hackgame)

NYvwzfd.png

一开始给十个CTB,而flag需要20个CTB,我们需要理财赚够20个。  
理财是只能买入TDSU才可以获得收益。我们先上来直接把CTB全部换成TDSU。  

ltMvAEX.png

上边是我们花了所有TDSU:66060买了19分钟后的收益。(因为一个账号最多存在20分钟,计算你用脚本极限也不能买20分钟,必须留一分钟用来换TDSU和买入,取出等操作)  
还是不行,算上收益的钱1200231也不够买20个CTB。  

考虑买RMX是否存在汇率差。

发现一个CTB57个RMX,一个RMX值115TDSU,也就是一个CTB值6555个TDSU,还不如直接买。  

只能考虑另外的情况:

整形溢出

在买入份额上输入很大的数或者负数,都会有错误提示,交易失败。此处不存在整形溢出。  
再买入时间上输入很大的数  

a8mrB5s.png

成功溢出。仔细观察这个值,会发现。

iMsxZSo.png

是int64类型的溢出。

直接购买9223372036854775808时间,份额为1000,收益仍为负数。尝试将时间慢慢调小。  
9123372036854775808(第二位2改为了1)成功让世间变为负的,且收益为正.(跳不出来慢慢调,后边写下原理)  

zJeuci2.png

时间为负的直接去出来就好了,然后兑换flag。

②LTshop(护网杯)

前边的条件竞争不说了,开个burp多线程买几个大辣条,买4个就好了,为啥起码4个,后边有介绍。

其实看到最后的9999999999.......个大辣条换flag也能猜到是溢出。

这里存在uint64整数溢出。  
2^64-1为最大值:18446744073709551615  

这里如果我们直接输入18446744073709551615,服务器端肯定会先给你 *5,为啥呢?

因为判断你大辣条的数目啊,一个辣条之王得用5个大辣条来换啊,所以溢出过大了,而我们的要求是正好溢出一点点,所以说除以5=3689348814741910323。

这个时候输入3689348814741910323,服务端 *5=18446744073709551615,虽然表面上是18446744073709551615,实际上为0。

所以我们稍微加1,输入3689348814741910324,* 5=18446744073709551620,实际上服务端以为我们只买4个大辣条。所以成功购买那么多大辣条。

总结的问题

①uint64溢出范围0-18446744073709551615(没有负数哟)

②为什么非要买4个大辣条,你输入的数据乘以五后是18446744073709551620。

溢出界限(最大数)是18446744073709551615,也就是说这个数字还没有溢出,一旦加1,就变成了0,也就是说18446744073709551616代表0,以此类推18446744073709551620代表4  

③这两个题目溢出类型不一样:

猫咪银行是int64,存在负数,所以构造的时候钱数有可能是负数,所以你得自己计算收益(和买入时间和买入份额有关系。)  
ltshop没有负数,不然的话18446744073709551615+1=18446744073709551616实际上代表了-18446744073709551616你得再加上18446744073709551617=36893488147419103233才能代表买一个大辣条。  

④关于ltshop为什么是uint64溢出,我也不知道啊,凉了啊。
别人的wp上边是看的cookie,知道了框架,然后才知道的溢出类型,如果你实在不知道什么溢出类型,那你就把这几个溢出类型挨个试一下。

⑤猫咪银行那到题目不是随便买的,而是猜的。

虽然9223372036854775807是最大数,但是你的收益和时间才是最终决定你溢出是否成功的条件。我们得想个办法让你的收益溢出的时候为较大的正数并且满足时间为过去的时间,或者取出时间在20分钟之内。所以我们输入的数要先让他达到溢出的临界值。

然后让这两个数在-9223372036854775808到9223372036854775807之间达到我们想要的,计算的话太麻烦了,不如直接猜,每次一个范围一个范围的测试就好了。

好像太大了也不行,会出问题,比如我一开始输入很大的数,怎么调都是-9223372036854775808

转载于:https://www.cnblogs.com/zaqzzz/p/9984576.html

### CTF Web 应用整数溢出漏洞利用与防御 #### 整数溢出概述 在编程语言中,当数值超出其数据类型的表示范围时会发生整数溢出。对于有符号整数,这可能导致负值;对于无符号整数,则会绕回到零并继续增加。这种行为可以被攻击者用来执行未授权的操作或访问敏感信息[^1]。 #### 漏洞成因分析 Web应用程序中的输入验证不足是造成此类安全风险的主要原因。如果开发者未能正确处理边界条件或者假设用户提交的数据总是合法的,在特定情况下就可能触发整数溢出错误。例如,PHP脚本可能会因为不当使用`intval()`函数而变得脆弱[^2]。 #### 利用方法探讨 为了成功利用该类漏洞,通常需要满足以下几个前提条件: - 受影响的应用程序存在可预测的行为模式; - 攻击面允许外部控制某些变量值; - 这些受控变量参与了关键逻辑运算过程。 一旦找到合适的切入点,可以通过构造特殊的请求参数来诱导服务器端发生预期之外的结果,比如越界读写内存地址、改变权限级别等操作[^3]。 ```python # 假设有一个易受影响的API接口 /api/vulnerable_endpoint?param=VALUE import requests for i in range(-10, 10): response = requests.get(f"http://example.com/api/vulnerable_endpoint?param={i}") print(response.text) ``` 上述代码片段展示了如何通过遍历不同取值区间内的整型参数尝试探测潜在的安全隐患。 #### 防护措施建议 针对这类问题的有效缓解策略包括但不限于: - **严格校验所有来自客户端的数据**:确保任何进入系统的数字都在合理范围内,并且采用适当的方式转换为内部使用的格式。 - **启用编译器内置保护机制**:现代C/C++编译工具提供了多种选项用于检测运行期间可能出现的异常情况(如GCC/Clang `-fstack-protector-strong`标记)。 - **定期审查源码质量**:借助静态分析工具自动发现隐藏深处的风险点,同时鼓励团队成员遵循最佳实践编写健壮可靠的软件产品[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值