代码编织梦想

需求理解

上回,我们提取了greedy特征的新pattern,这回将其落实于代码之中。
具体思路如下:

  • 分析原有代码
  • 观察何时检测greedy漏洞
  • 将新pattern落实于代码

话不多说,让我们开始行动吧!

1.分析原有代码

1.1 代码何时调用?

什么时候调用了greedy的分析函数呢?

main() -> execution_and_analyze(contract_path) -> before_sym_exec(vm,name) -> function_analysis(vm)

在main()函数中,如果对合约进行分析(参数为 -e 或者分析整个文件夹内的合约),那么会调用execution_and_analyze。

在execution_and_analyze函数中:

  • 1.调用 load() 加载合约至 vm 中。
  • 2.分别调用 before_sym_exec、detect_fake_eos、after_sym_exec

在before_sym_exec函数中:

  • 1.调用locate_transfer
  • 2.调用function_analysis进行greedy检测

综上所述,在每次检测合约的时候,在动态执行之后(?存疑,load之中进行动态执行),检测greedy。

1.2 获取原有代码

分析部分代码如下:

def function_analysis(vm) -> None:
    """Analysis function, it read the opcode and arguments of function
    and detect vulnerability of smart contract. The analysis result will
    be store in global varibles.

    Args:
        vm: the virtual include env and structure.
    """

    funcs = vm.module.funcs
    # if the analyzed contract is ethereum
    if global_vars.contract_type == 'ethereum':
        # ...判断delegateCall的代码

        # 1. Count the non payable functions, finally get the number of payable functions.
        # 2. If there are payable functions in the contract but no *ethereum.call*, greedy exists.
        non_payable_count = 0
        offset = len(vm.module.imports)
        main_index = global_vars.main_function_address - len(vm.store.funcs) + len(funcs)
        for index, func in enumerate(funcs):
            if index == main_index:
                continue
            expr = func.expr
            is_payable = True
            for i, instr in enumerate(expr.data):
                if (instr.code == bin_format.call and vm.module_instance.funcaddrs[
                    instr.immediate_arguments] in global_vars.get_call_value_addr
                        and _is_non_payable_function(expr, i)):
                    non_payable_count += 1
                    is_payable = False
                    break
            if is_payable:
                global_vars.ETH_payable_function_address_set.add(index + offset)
        if non_payable_count <= len(funcs) - 2 and not global_vars.send_token_function_addr:
            global_vars.cannot_send_ETH = True

1.3 分析代码

temp

Y
N
Y
N
Y
N
弹栈取位置
这个位置是实数吗
取值压栈
位置在global_state里吗
取值压栈
化简并取出变量且找个新名字
新名字在约束中吗
更新约束中的对应变量
global_state赋值并压栈

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_43295763/article/details/111102156

python Flask配置mysql数据库使用-爱代码爱编程

第一步 创建Flask pip install flask 成功安装之后如app.py from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'hello world' if __name__ == '__main__':

NMS(非极大值抑制)总结-爱代码爱编程

本文来源于公众号《CV技术指南》的技术总结部分,更多相关技术总结请扫描文末二维码关注公众号。 导言:     Non-Maximum Suppression(NMS)非极大值抑制,也有个别地方称之为非最大值抑制。个人认为前者更为贴切,因为其具体实现原理是找到所有局部最大值,并抑制非局部最大值,而不是找全局最大值,后文会介绍代码。从字面意思理解,抑制那些

《图解深度学习》学习笔记(六)-爱代码爱编程

第七章 深度学习工具 1、Theano 在学习Theano时,我们必须了解共享变量的概念。由于函数的输入和输出是Python的Numpy数组,所以每次调用这些函数时,GPU都需要将其复制到内存里。如果使用共享变量,GPU就可以从共享变量中获取数据,无须每次都将数据复制到内存里。通过使用共享变量,使用误差反向传播算法等梯度下降法估计参数时,就无须每次

Python爬取房天下二手房信息-爱代码爱编程

实现python爬取房天下网站所有城市的二手房信息 文章目录 一、相关知识二、目标三、实现思路1.准备工作2.获取所有城市及对应网址3.遍历城市,获取所需信息4.将分解的信息存到csv中四、完整代码五、实现结果 一、相关知识 BeautifulSoup4使用python将信息写入csvimport csv with open("11.csv

PyCharm中Scientific Mode(科学模式)的运行及退出-爱代码爱编程

PyCharm 在2017.3版本之后加入了Scientific Mode,在科学计算时,可以方便的追踪变量变化等。 使用NumPy的时候,系统会提示 use scientific mode,但进去后就运行程序的在控制台中,很麻烦,想改回来的话按下面步骤取反即可. 有时打开了scientific mode时,但文件中引入了numpy 等科学计算包时并

opencv笔记01-爱代码爱编程

python opencv3图像处理课程学习1——图像加载与保存 加载图片 import cv2 as cv import numpy as np #获得图像的一些属性 def get_image_info(image): print(type(image)) # 输出加载图片的类型 print(image.shape)

第42篇 如何通过solc编译智能合约-爱代码爱编程

本文环境: 区块链版本:以太坊POA联盟链 节点版本: geth 1.9.19 本文合约源码:参考文档《第39篇 defi实战-质押挖矿智能合约(上)》 nodejs版本:v10.14.0 操作系统:windows 64   solidity编写的以太坊智能合约可通过命令行编译工具solc来进行编译,成为以太坊虚拟机中的代码。solc编译后最

许可区块链是许多金融应用未来的关键特性-爱代码爱编程

本期主题为“通向未来的融合技术”——区块链技术与AI、大数据、隐私计算技术结合起来,就可以对于开放金融、数字医疗、可依赖的AI应用等经济利基领域进行迅速地填补,从而为下一轮经济升级奠定基础。 熊伟:相比公共区块链,许可区块链是一种更实用、更有用的许可数据共享系统的设计方法,是许多金融应用未来的关键特性或关键因素。  对数字经济的探讨中,虽然去中心化是

别再用智能合约时代的思维,去思考下一代区块链应用-爱代码爱编程

BTC 带来了基于区块链的去中心化数字货币,以太坊有了智能合约平台,诞生了像 Uniswap 这样 “有区块链灵魂” 的初级应用,那么下一代区块链应用会是什么样呢? 回答这个问题,我们试图从计算机应用的发展历史中寻找一些踪迹,来推测区块链应用的发展,以及我们为什么看好波卡技术。 比特币时代:货币层面的应用 1946 年美国制造出第一台通用计算机