首页 > 其他分享 >bits of static binary analysis阅读随笔

bits of static binary analysis阅读随笔

时间:2023-05-17 22:45:53浏览次数:54  
标签:node binary successors Simprocedure analysis static mystery main 节点

标题是bits of static binary analysis,意思为碎片化粒度的静态二进制分析

  • 作为安全研究人员,如何从复杂系统的二进制文件中挖掘出漏洞是个难题
  • 在这篇随笔中,阅读bits of static binary analysis演讲内容,学习查找二进制程序中的漏洞,并快速找到它们
  • 静态分析,使用VEX和CFG来表示分析的程序,污点分析,使用关系依赖图和Reaching Definition analysis(可达定义分析)

静态分析

在不实际运行程序的情况下收集程序中数据的运行时信息的技术。一次同时对几个状态进行推理,但不太精确

源代码VS二进制

很简单,对于二进制安全研究人员来说,不是一切二进制文件都能找到源代码,所以研究如何分析二进制文件是一个必要的工作

VEX中间表示(IR)

不展开解释,https://github.com/angr/pyvex#vex-intermediate-representation

控制流图(CFG)

学二进制的人很常见,IDA反编译好的时候就会切换到控制流视图。https://docs.angr.io/built-in-analyses/cfg#cfgfast-details
这里有个例子,在bits of static binary analysis对于的github仓库里
编译出vex_and_cfg,main函数很简单
int __cdecl main(int argc, const char **argv, const char **envp) { puts("hello world!"); return 0; }
输出一个hello world!

vex_and_cfg

from angr import Project

project = Project('../build/vex_and_cfg', auto_load_libs=False)
architecture = project.arch
cfg = project.analyses.CFGFast()

‘#’使用project.kb.functions.function(name='main')获取名为'main'的函数对象
main_function = project.kb.functions.function(name='main')

‘#’ 获取'main'函数的所有基本块(basic blocks)并存储在blocks_of_main列表中。
blocks_of_main = list(main_function.blocks)

‘#’ 从'main'函数的基本块列表中获取第一个基本块,并获取该基本块的VEX表示。
main_vex = blocks_of_main[0].vex

‘#’ 从CFG中获取' main '的第一个节点(基本块)。
main_entry_node = cfg.model.get_any_node(main_function.addr)

‘#’ 通过main_entry_node.successors可以获得所有直接后继节点的列表,而使用索引 [0] 获取列表中的第一个后继节点。
mystery_node = main_entry_node.successors[0]
print(mystery_node.addr)

‘#’ Simprocedure!?Simprocedure是一种特殊的函数处理机制。它们是对特定函数进行模拟的过程,用于处理无法静态分析的函数、外部库函数或操作系统调用等。这里应该是表示调用导入的puts?
mystery_simprocedure = mystery_node.successors[0]
print(mystery_simprocedure.name)

‘#’ The mystery returns to main.
main_other_node = mystery_simprocedure.successors[0]
print(main_other_node.addr)

一些补充说明

  1. main_entry_node.successors[0]是获取main_entry_node的第一个后继节点的方式。在Angr库中,控制流图中的节点表示程序的基本块,而后继节点表示控制流图中当前节点的直接后继节点。通过main_entry_node.successors可以获得所有直接后继节点的列表,而使用索引 [0] 获取列表中的第一个后继节点。所以,main_entry_node.successors[0]表示获取了main_entry_node的第一个后继节点。根据代码的上下文,这个节点被赋值给了mystery_node。
  2. 在Angr库中,Simprocedure是一种特殊的函数处理机制。它们是对特定函数进行模拟的过程,用于处理无法静态分析的函数、外部库函数或操作系统调用等。根据给定的代码,mystery_node.successors[0]返回的节点被认为是一个Simprocedure节点。通过将该节点赋值给mystery_simprocedure,可以对该Simprocedure节点进行进一步的分析和处理。Simprocedure节点通常表示对于某个特定函数的模拟过程,而不是真正的代码。可能是对函数调用的模拟、处理外部库函数的模拟等。要了解具体的Simprocedure类型和其模拟的功能,需要进一步研究或查看相关文档。
    作为一个Simprocedure节点,它可能具有以下一些常见的成员变量(属性):
    name: Simprocedure的名称,表示所模拟的函数或操作的名称。
    addr: Simprocedure的地址,表示在二进制文件中的位置。
    successors: 后继节点列表,表示在Simprocedure执行后可能到达的下一个节点。
    predecessors: 前驱节点列表,表示在Simprocedure执行前可能到达该节点的前一个节点。
    statements: Simprocedure的语句列表,表示模拟函数或操作的具体执行过程。
    arguments: 表示传递给Simprocedure的参数。
    returns: 表示Simprocedure的返回值。
    这些成员变量的具体名称和内容可能根据使用的Angr版本、Simprocedure类型以及代码中的具体实现而有所不同。要查看mystery_simprocedure对象的成员变量,可以打印或使用调试工具查看对象的属性。例如,可以尝试使用print(mystery_simprocedure.dict)来查看该对象的所有成员变量。

待续

标签:node,binary,successors,Simprocedure,analysis,static,mystery,main,节点
From: https://www.cnblogs.com/j1pai/p/17410305.html

相关文章

  • Java static、final、static final 以及final static区别
    一、相同点都是Java修饰符二、不同点finalfinal修饰类:表示该类不能被继承;final修饰方法:表示该方法不能被重写;final修饰方法参数:表示在变量的编译期中它的值不能被改变;final修饰变量:包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲......
  • Java:static关键字
    (一)static关键字的基本用法1.static关键字基本概念我们可以一句话来概括:方便在没有创建对象的情况下来进行调用。也就是说:被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。2.static关键字修饰类Java里面static一般用来修饰成员变量或函数。但有一种特殊用......
  • C++:全局变量和static变量初始化
    (一)全局变量全局变量、文件域中的静态变量、类中的成员静态变量在main函数执行前初始化;局部变量中的静态变量在第一次调用时初始化。C++保证,全局变量在main函数第一次使用它之前,就把它初始化好。(可以直接理解成在main函数执行前就初始化好)但这个初始化可细分为:编译时初始化和运......
  • 【Java】非访问修饰符 final、static 、abstract
    非访问修饰符final修饰符final可以修饰类、属性和方法<但不能用于修饰构造方法>private不能被子类方法覆盖,private类型的方法默认是final类型的 final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。Tips:final变量定义的时候,可以先......
  • 深入理解 python 虚拟机:描述器的王炸应用-property、staticmethod 和 classmehtod
    深入理解python虚拟机:描述器的王炸应用-property、staticmethod和classmehtod在本篇文章当中主要给大家介绍描述器在python语言当中有哪些应用,主要介绍如何使用python语言实现python内置的proterty、staticmethod和classmethod。property当你在编写Python代码......
  • Survival analysis
    准备工作#安装R包#install.packages(c("survival","survminer"))#加载R包library(survival)library(survminer)#survival包里包含的数据集data(package="survival")#以肺癌数据为例,显示数据前六行head(lung)##insttimestatusagesexph.ecogph.karnopat.kar......
  • static关键字
    static全局静态变量1.普通全局变量和static全局静态变量都是静态存储方式。普通全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,普通全局变量在各个源文件中都是有效的 2.静态全局变量限制了其作用域,只在定义该变量的源文件内有效static局部静态变量局部静态变......
  • 掌握C++中static关键字的多种使用场景
    static是什么在最开始C中引入了static关键字可以用于修饰变量和函数,后来由于C++引入了class的概念,现在static可以修饰的对象分为以下5种:成员变量,成员函数,普通函数,局部变量,全局变量static的作用修饰成员变量static修饰成员变量之后,该变量会属于该类,而不是某一个该类的对象。......
  • java中static方法不能被重写但是能重定义
    1、static方法不能被重写示例1classAnimal{publicstaticvoidwalk(){System.out.println("Animal的行走方法");}}classDogextendsAnimal{publicvoidwalk(){System.out.println("Dog的行走模式");}publicstaticv......
  • static,和auto关键字
    这两个关键字是一对的static表示静态publicstaticvoidmothed1(){stringtext="234.567891230";//Console.WriteLine(int.Parse(text));//必须是对应的类型Console.WriteLine(double.Parse(text));C......