DeFiVulnLabs靶场全系列详解(二十四)先除后乘造成整数截断,计算产生错误

admin 2025年3月16日22:40:35评论12 views字数 1078阅读3分35秒阅读模式
01
前言
此内容仅作为展示Solidity常见错误的概念证明。它严格用于教育目的,不应被解释为鼓励或认可任何形式的非法活动或实际的黑客攻击企图。所提供的信息仅供参考和学习,基于此内容采取的任何行动均由个人全权负责。使用这些信息应遵守适用的法律、法规和道德标准。
DeFiVulnLabs一共有47个漏洞实验,包括各种经典的合约漏洞和一些少见的可能造成安全问题的不安全代码,本系列将逐一解析每个漏洞,包括官方的解释和自己的理解。
02
先除后乘造成截断

漏洞解析

    由于solidity里不支持小数点,因此小数点后面的数字会进行截断(不是四舍五入)只取前面整数,从而对计算结果产生问题。

代码解析:

    代码简单的说明了两种情况(先乘后除,和先除后乘),正确的计算合约是先乘后除。

pragma solidity ^0.8.0;//错误的合约contract Mis_calculation {    function price(        uint256 price,        uint256 discountpublic pure returns (uint256) {        return (price / 100) * discount; // wrong calculation    }}//正确的合约contract Calculation {    function price(        uint256 price,        uint256 discountpublic pure returns (uint256) {        return (price * discount) / 100// correct calculation    }}

错误的计算方式——Mis_calculation方法调用

DeFiVulnLabs靶场全系列详解(二十四)先除后乘造成整数截断,计算产生错误

如果传入的是10,10,那么就是10/100  *10  那么实际结果0.1会被当成0,最终结果就是0

如果传入的是120,10,那么就是120/100 *10 那么实际结果1.2会被当成1,最终结果就是10

如果传入的是120,10,那么就是1900/100 *10 那么1.9也会被当成1,最终结果就是10

正确的Calculation方法调用,传入10,10,答案是1,正确

DeFiVulnLabs靶场全系列详解(二十四)先除后乘造成整数截断,计算产生错误

DeFiVulnLabs靶场全系列详解(二十四)先除后乘造成整数截断,计算产生错误

03
如何修复该问题
上面已经给出了正确的合约计算,当同时出现乘法和除法的时候,始终在除法之前执行乘法,以避免失去精度
05
感谢关注
个人语雀账号:https://www.yuque.com/iceqaq

原文始发于微信公众号(Ice ThirdSpace):DeFiVulnLabs靶场全系列详解(二十四)先除后乘造成整数截断,计算产生错误

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月16日22:40:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DeFiVulnLabs靶场全系列详解(二十四)先除后乘造成整数截断,计算产生错误http://cn-sec.com/archives/3837192.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息