精华内容
下载资源
问答
  • BinSkim二进制分析仪 ...查找有关用于输出Binskim结果的静态分析结果交换格式( )的更多信息 命令行快速指南 参数(短格式,长格式) 意义 --sympath 符号路径值(例如SRV http://msdl.microsoft.com/downloa
  • 利用angr进行二进制静态分析

    千次阅读 2017-11-15 11:00:54
    angr是一个二进制代码分析工具,能够自动化完成二进制文件的分析,并找出漏洞。angr基于python,它将以前多种分析技术集成进来,­­­它能够进行动态的符号执行分析,也能够进行多种静态分析。本文以介绍angr的基本...

    简介:

    angr是一个二进制代码分析工具,能够自动化完成二进制文件的分析,并找出漏洞。angr基于python,它将以前多种分析技术集成进来,­­­它能够进行动态的符号执行分析,也能够进行多种静态分析。本文以介绍angr的基本信息与静态分析二进制文件方法为主。

    Angr的基本过程:

    (1)将二进制程序载入angr分析系统

    (2)将二进制程序转换成中间语言(intermediate representation,IR)

    (3)将IR语言转换成语义较强的表达形式,比如,这个程序做了什么,而不是它是什么。

    (4)执行进一步的分析,比如,完整的或者部分的静态分析(依赖关系分析,程序分块)、程序空间的符号执行探索(挖掘溢出漏洞)、一些对于上面方式的结合。

    安装方法:

    Linux:(两种不同方法)

    1.  依赖:sudo apt-getupdate; sudo apt-get upgrade; 

    sudo apt-getinstall python-dev libffi-dev build-essential libssl-dev python-pip;

    虚拟环境:sudo pipinstall urllib3 request virtualenvwrapper virtualenv

    下载angr-dev:git clone https://github.com/angr/angr-dev; cd angr-dev

    自动化安装:./setup.sh-i -e angr(自动化安装一切)

    2.  安装依赖:sudo apt-get install python-dev libffi-dev build-essential virtualenvwrapper

    安装angr:mkvirtualenv angr && pip install angr

     

    两种安装方法可以先尝试一种,安装失败再尝试另一种。

    安装之后都可以用workon angr命令进入angr环境。进入angr环境然后进入Python环境,使用import angr导入angr环境。

     

    另:若分析CFG信息,需要安装angr-utils:

    gitclone https://github.com/axt/angr-utils. 然后python setup.pybuild;python setup.py install

     

     

    Angr的使用:

    1.装载:

    angr的二进制装载组件是CLE,它负责装载二进制对象(以及它依赖的任何库)和把这个对象以易于操作的方式交给angr的其他组件。

    angr将这些包含在Project类中。一个Project类是代表了二进制文件的实体。angr的大部分操作都会经过它。

    使用angr装载一个二进制文件(比如说,“/bin/true”),需要这样做:

    >>>import angr

     

    >>> b = angr.Project("/bin/true")

     

    这样操作之后,b就是主二进制文件以及它依赖的所有库的代表。可以从b这个project中得到二进制文件的一些信息:

    # 这是二进制文件的入口点
    >>>print b.entry
     
    # 这些是二进制文件内存空间中的最小地址和最大地址
    >>>print b.loader.min_addr(), b.loader.max_addr()
     
    # 这些是文件的全名
    >>>print b.filename
     

    2.中间语言

    由于angr需要处理很多不同的架构,所以它必须选择一种中间语言(IR)来进行它的分析。angr使用Valgrind的中间语言——VEX来完成这方面的内容。VEX中间语言抽象了几种不同架构间的区别,允许在他们之上进行统一的分析:

    ·寄存器名。在不同架构间的寄存器数量和名字是不一样的,但是现代的各CPU设计有通用之处:每一种CPU包含几个通用寄存器,一个寄存器装载栈指针,一系列寄存器装载状态标志等等。中间语言提供了一个统一的、抽象的对于不同平台的寄存器接口。VEX模型将寄存器作为一个独立的内存空间,使用偏移来访问它们(比如,AMD64的rax寄存器在这个内存空间的偏移16的地址上)。

    ·内存访问。不同的架构使用不同的方式访问内存。比如ARM既可以通过小端序也可以通过大端序来访问内存。中间语言必须能够抽象分离出其中的差异。

    ·内存分段。一些架构,比如x86,通过使用特殊的段寄存器实现内存的分段。中间语言能够理解这样的内存访问机制。

    ·指令的副作用。大多数的指令有产生一些影响。比如,ARM中Thumb模式下的大多数操作会更新状态标志,栈上的push/pop操作更新栈指针。在分析中通过ad hoc 的方式来跟踪这些影响是愚蠢的,所以中间语言使这些影响很清晰直接。

    将二进制代码转换为VEX已经有了很好的支持。VEX是一种支持大量目标机器语言的架构无关、无副作用的语言。它抽象了机器指令到中间表达来使程序更易于分析。这一中间语言有四个主要的对象类:

    ·表达式(Expressions)。IR表达式代表了一个计算出的数值或者常量。这包括了内存装载,读寄存器以及算数计算的结果。

    ·操作(Operations)。IR操作描述了对IR表达式的修改。这包括了整形的运算,浮点型的运算,位运算等等。一个IR操作应用于IR表达式会产生一个IR表达式作为结果。

    ·临时变量(Temporary variables)。VEX使用临时变量作为内部寄存器:IR表达式在使用过程中存储在临时变量中。临时变量的值可以通过IR表达式重新获取。这些临时变量被从t0开始编号,且是强类型的(比如64位的整形或者32位的浮点型)。

    ·语句(Statements)。IR语句模型根据目标机器而改变,比如内存存储和写寄存器产生的效果,IR语句使用IR表达式获取可能用到的值。比如,一个内存存储操作的IR语句使用IR表达式作为要写入的目标地址,使用另一个IR表达式作为要写入的内容。

    ·块(Blocks)。一个IR块是一系列IR语句的集合,代表了目标架构上的一个扩展块(术语为“IR超级块(IR Super Block)”或者“IRSB”)。一个超级块可以有多个出口。在基本块中间有条件退出时,会使用特殊的退出IR语句。一个IR表达式被用来代表在块的最后无条件退出时的目标指向。

     

    Angr中使用一个叫做pyvex的库作为Python和Vex的接口,pyvex可以通过 Project.factory.block接口来访问。有很多种不同的对象可以用来访问一个块的属性,但是他们在分析特定的字节序列的时候具有共通特性。通过factory.block构造器,可以得到一个能够轻松转换成几种不同代表的Block对象。尝试.vex来获取pyvex的IRSB,或者.capstone获取Capstone块:

     

    >>>import angr

     

    # 装载二进制程序

    >>> b = angr.Project("/bin/true")

     

    # 转换入口点为基本块

    >>> irsb = b.factory.block(b.entry).vex

    >>> irsb.pp()

     

    # 转换特定地址为基本块

    >>> irsb = b.factory.block(0x401340).vex

    >>> irsb.pp()

     

    # 这是代表了这一基本块的最后无条件退出时的跳转目标的IR表达式

    >>>print irsb.next

     

    # 这一无条件退出的类型(比如,一个函数调用,或者从一个函数返回,或者是系统调用等等)

    >>>print irsb.jumpkind

     

    # 你也可以将它以良好的可读方式打印出来

    >>> irsb.next.pp()

     

    # 遍历每一个语句并且将它们打印出来

    >>>for stmt inirsb.statements:

    ...     stmt.pp()

     

    # 打印代表了数据的IR表达式以及其被对应的存储语句存储下来的类型

    >>>import pyvex

    >>>for stmt inirsb.statements:

    ...     ifisinstance(stmt,pyvex.IRStmt.Store):

    ...         print"Data:",

    ...         stmt.data.pp()

    ...         print""

    ...         print"Type:",

    ...         print stmt.data.result_type

    ...         print""

     

    # 打印基本块中每一个条件退出的条件和跳转目标

    ...for stmt in irsb.statements:

    ...     ifisinstance(stmt,pyvex.IRStmt.Exit):

    ...         print"Condition:",

    ...         stmt.guard.pp()

    ...         print""

    ...         print"Target:",

    ...         stmt.dst.pp()

    ...         print""

     

    # 这些是在IRSB中的每一个临时变量的类型

    >>>print irsb.tyenv.types

     

    # 这是获取第0个临时变量的类型的一种方法

    >>>print irsb.tyenv.types[0]

    3.分析

    了解了angr的装载和IR,下面来用例子说明angr的分析模块。Analyses可以从程序中获取一些信息的自定义的分析行为,包括:

    这里以分析CFG为例来调用analyses,生成一个accurate CFG:

    >>>import angr

     

    >>> b=angr.Project(‘/bin/true’,load_optins={‘auto_load_libs’:False})

     

    >>> cfg= b.analyses.CFGAccurate(keep_state=True)

     

    在构造CFGFast或者CFGAccurate或其他分析行为时,有很多不同的选项可以设置,具体请参考http://angr.io/api-doc/index.html。需要说明的是,CFG图是NetworkX    di-graph,也就是如果需要生成CFG图形视图,需要安装networkx。

     

    例子:

    import angr

    from angrutils import plot_cfg

     

    proj = angr.Project("<...>/ais3_crackme",load_options={'auto_load_libs':False})

    main = proj.loader.main_bin.get_symbol("main")

     

    start_state = proj.factory.blank_state(addr=main.addr)

    cfg = proj.analyses.CFG(fail_fast=True, starts=[main.addr],initial_state=start_state)

    plot_cfg(cfg, "ais3_cfg", asminst=True, remove_imports=True, remove_path_terminator=True

     

     

     

     

     

    输出CFG:(图中为部分CFG)

    在对构造的CFG进行信息提取时,以粗粒度CFI为例,可以在CFG中得到所有遍历到的函数头信息与函数大小;利用pyvex中IRSB的信息可以得到所有jumpkind为call的基本块,而基本块的最后一条IMark信息就是call指令地址。其他的类似于call target,jump target,return target等信息也可以通过脚本去生成的CFG和IRSB模块中提取。

     

     

     

     

     

     

     

     

     

     

    参考资料:

    http://www.angr.io/api-doc/index.html

    https://docs.angr.io/INSTALL.html

    https://github.com/angr/angr-doc/blob/master/docs/toplevel.md

    http://www.angr.io/

    展开全文
  • BinCAT 一个直接从IDA进行静态二进制代码分析工具包,旨在帮助进逆向工程师
  • Pharos静态二进制分析框架 Pharos静态二进制分析框架是卡内基梅隆大学软件工程学院的一个项目。... 由于发布此代码的主要目的是使我们的研究透明,并促进与其他二进制静态分析研究人员的对话,请随时与Cor
  • angr是一个二进制代码分析工具,能够自动化完成二进制文件的分析,并找出漏洞。在二进制代码中寻找并且利用漏洞是一项非常具有挑战性的工作,它的挑战性主要在于人工很难直观的看出二进制代码中的数据结构、控制流...

    什么是angr:

    angr是一个二进制代码分析工具,能够自动化完成二进制文件的分析,并找出漏洞。在二进制代码中寻找并且利用漏洞是一项非常具有挑战性的工作,它的挑战性主要在于人工很难直观的看出二进制代码中的数据结构、控制流信息等。angr是一个基于python的二进制漏洞分析框架,它将以前多种分析技术集成进来,­­­它能够进行动态的符号执行分析(如,KLEE和Mayhem),也能够进行多种静态分析。

    angr的基本过程:

    1)将二进制程序载入angr分析系统

    2)将二进制程序转换成中间语言(intermediate representation, IR)

    3)将IR语言转换成语义较强的表达形式,比如,这个程序做了什么,而不是它是什么。

    4)执行进一步的分析,比如,完整的或者部分的静态分析(依赖关系分析,程序分块)、程序空间的符号执行探索(挖掘溢出漏洞)、一些对于上面方式的结合。

    如何安装:

    Linux

    首先安装依赖

    sudo apt-get install python-dev libffi-dev build-essential virtualenvwrapper

    安装angr

    mkvirtualenv angr && pip install angr

    到此angr安装结束

    Mac OS 

    首先安装依赖

    pip install -I --no-use-wheel angr-only-z3-custom

    安装angr

    pip install angr

    安装完成之后,就可以导入angr了,但是这个地方我与网上一些教程不同,在导入angr的时候,有的教程上面说需要先进入angr的虚拟环境 然后再进入python环境中,再导入angr模块,但是我按照他说的那样做报错,是没有angr模块的,本人用的ubuntu14.04虚拟机,直接进入python环境才可以导入angr模块,不需要进入angr的虚拟环境。

    angr过程分析

    angr-CLE

    CLE是angr加载二进制文件的组建,在加载二进制文件的时候会分析病读取binary的信息,包括指令地址、shared library、arch information等等。

    >>> import angr
    
    >>> b = angr.Project("./test")

    angr_IR

    angr用VEX IR将指令转化为中间语言IR,分析IR并且模拟,搞清楚它是什么并且做了什么。

    如下的ARM指令

    subs R2, R2, #8

    转化为VEX IR

    t0 = GET:I32(16)
    t1 = 0x8:I32
    t3 = Sub32(t0,t1)
    PUT(16) = t3
    PUT(68) = 0x59FC8:I32

    angr-Solver Engine

    angr的求解引擎叫Claripy,具体这一步做什么呢,根据程序所需要的输入设置符号变量以及收集限制式等等。

    >>> import claripy
    
    >>> bv = claripy.BVV(0x41424344, 32)

    例子

    这个例子说明了angr的简单用法,用例程序来自https://github.com/angr/angr-doc/tree/master/examples/sym-write,其中有三个文件,一个是C源码,一个是二进制代码,还有一个是python脚本文件也就是我们的测试脚本。

    源码如下

    #include <stdio.h>
    
    
    char u=0;
    int main(void)
    {
    	int i, bits[2]={0,0};
    	for (i=0; i<8; i++) {
    		bits[(u&(1<<i))!=0]++;
    	}
    	if (bits[0]==bits[1]) {
    		printf("you win!");
    	}
    	else {
    		printf("you lose!");
    	}
    	return 0;
    }

    这个源码很简单就不介绍了。

    接下来就是python脚本文件,GitHub上面的脚本文件在我的虚拟机上面运行出错,据本人分析应该是angr更新之后对于有一些属性进行了修改,比如脚本文件中的sm = p.factory.simgr(state)  这一行代码就会报错,因为没有simgr这个属性,以及在main函数return的地方sm.found[0].state.se.any_int(u),这样修改才不会报错,不然会出现path没有se属性的错误。为了便于阅读,我自己写了一个python脚本对这个二进制代码进行分析。

    import angr
    import claripy
    def main():
            p = angr.Project('./issue', load_options={"auto_load_libs": False})
            state = p.factory.entry_state(add_options={"SYMBOLIC_WRITE_ADDRESSES"})
            u = claripy.BVS("u", 8)
            state.memory.store(0x804a021, u)
            sm = p.factory.path_group(state)
            sm.step(until = lambda lpg: len(lpg.active) > 1)
            for I in range(len(sm.active)):
               print "possible %d: " % I , sm.active[I].state.se.any_int(u)
            return sm.active[0].state.se.any_int(u)
    if __name__ == '__main__':
            print(repr(main()))

    代码分析:

    新建一个angr工程,导入二进制文件,./issue是二进制文件的路径。后面选项是是否自动加载依赖。

     p = angr.Project('./issue', load_options={"auto_load_libs": False})

    紧接着创建一个SimState对象,SimState的对象在angr其中的一个子模块SimuVEX中,这个对象记录着符号信息,符号对应的内存信息,寄存器信息等等。

    state = p.factory.entry_state(add_options={"SYMBOLIC_WRITE_ADDRESSES"})

    设置符号变量,读C源码可以知道,变量u其实可以视为一个外部输入,根据u的值的不同,最后得到的结果也不相同,如果u的二进制表示中1和0的个数相同就返回win,否则返回lose。所以在此设计符号变量u

    u = claripy.BVS("u", 8)

    将符号变量保存在内存的指定地址处

    state.memory.store(0x804a021, u)

    接下来根据状态可以获取路径组对象,这个路径和你的状态参数有关,如果是入口状态那么你得到的路径就是入口处的路径。从获得的路径点开始,之后所有此路径分裂出去的路径都会包含在此路径组里面。

    sm = p.factory.path_group(state)

    然后开始执行,一直执行到active状态的路径超过一条的时候停止,即执行到C源码的if(bits[0]==bits[1])处,产生了两条路径,然后停止。

     sm.step(until = lambda lpg: len(lpg.active) > 1)

    然后打印出所有路径下的的U的取值

    for I in range(len(sm.active)):
               print "possible %d: " % I , sm.active[I].state.se.any_int(u)

    返回结果是win的u的取值

    return sm.active[0].state.se.any_int(u)

    到此主要代码分析结束,在GitHub上面有原始的python脚本,那个脚本只是输出结果为win时候的U的取值,但是那个脚本有错误,并且不太简介,由此我在此基础上做了修改,写了上述脚本,供大家参考分析。

    总结

    以上就是angr的基本用法,本人对于angr的理解也还是很浅显,有些地方也不是特别清楚,如果有错的地方,希望大家指点。

    转载处 http://www.freebuf.com/sectool/143056.html

    展开全文
  • BinCAT是静态二进制代码分析工具包,旨在直接从IDA或使用Python自动化来帮助逆向工程师。 它具有以下功能:价值分析(寄存器和内存)简介什么是BinCAT?BinCAT是静态二进制代码分析工具包,旨在直接从IDA或使用...
  • 二进制及代码分析工具

    千次阅读 2019-09-20 15:39:37
    二进制及代码分析工具: 吾爱破解论坛【爱盘】3.0 在线破解工具包https://github.com/ganlvtech/down_52pojie_cn Angrhttp://angr.io/ BAPhttps://github.com/BinaryAnalysisPlatform/bap Binary Ninjahttps://...

    二进制及代码分析工具:

    吾爱破解论坛【爱盘】3.0 在线破解工具包 https://github.com/ganlvtech/down_52pojie_cn

    Angr http://angr.io/

    BAP https://github.com/BinaryAnalysisPlatform/bap

    Binary Ninja https://binary.ninja/

    Bistro http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.309.105&rep=rep1&type=pdf

    Diablo http://diablo.elis.ugent.be/

    EEL http://pages.cs.wisc.edu/~larus/eel.html

    libdetox https://github.com/HexHive/libdetox

    Macaw https://github.com/GaloisInc/macaw

    McSema https://github.com/trailofbits/mcsema

    MultiVerse https://github.com/utds3lab/multiverse

    Pharos https://github.com/cmu-sei/pharos

    PSI http://seclab.cs.stonybrook.edu/seclab/pubs/vee14.pdf

    Reins https://www.utdallas.edu/~zhiqiang.lin/file/ACSAC12.pdf

    Shuffler https://www.usenix.org/system/files/conference/osdi16/osdi16-williams-king.pdf

    IRDB https://git.zephyr-software.com/opensrc/irdb-cookbook-examples

    Uroboros https://github.com/s3team/uroboros

    shellcode分析工具 https://github.com/suraj-root/smap/

    Shellcode/Obfuscate Code Generator https://github.com/zscproject/OWASP-ZSC

    linux下逆向工具 https://github.com/korcankaraokcu/PINCE

    Reverse Shell and Post Exploitation Tool https://github.com/panagiks/RSPET

    跨平台二进制分析及逆向工具 https://github.com/programa-stic/barf-project

    二进制分析工具 https://github.com/devttys0/binwalk

    关于软件虚拟化保护(如VMProtect)的资料 https://github.com/lmy375/awesome-vmp

    系统扫描器,用于寻找程序和库然后收集他们的依赖关系,链接等信息 https://github.com/quarkslab/binmap

    A Qt and C++ GUI for radare2 reverse engineering framework https://github.com/radareorg/cutter

    rp++ is a full-cpp written tool that aims to find ROP sequences in PE/Elf/Mach-O. https://github.com/0vercl0k/rp

    Windows Exploit Development工具 https://github.com/lillypad/badger

    二进制静态分析工具(python) https://github.com/bdcht/amoco

    Python Exploit Development Assistance for GDB https://github.com/longld/peda

    对BillGates Linux Botnet系木马活动的监控工具 https://github.com/ValdikSS/billgates-botnet-tracker

    Adhrit开源的安卓APK逆向和分析工具 https://github.com/abhi-r3v0/Adhrit/

    Assesses CPU security of embedded devices. iadgov https://github.com/iadgov/Maplesyrup

    pypacker: The fast and simple packet creation and parsing lib for Python. https://github.com/mike01/pypacker

    Windows driver and usermode interface which can hide objects of file-system and registry, protect processes and etc https://github.com/JKornev/hidden

    IoTSecurityNAT IoT安全测试系统,方便快速接入各种设备,进行安全测试。 https://github.com/3rdbody/IoTSecurityNAT

    木马配置参数提取工具 https://github.com/kevthehermit/RATDecoders

    Shellphish编写的二进制分析工具(CTF向) https://github.com/angr/angr

    针对python的静态代码分析工具 https://github.com/yinwang0/pysonar2

    一个自动化的脚本(shell)分析工具,用来给出警告和建议 https://github.com/koalaman/shellcheck

    基于AST变换的简易Javascript反混淆辅助工具 https://github.com/ChiChou/etacsufbo

    隐写检测工具 https://github.com/abeluck/stegdetect

    针对各种编程语言的静态分析工具、linters、代码质量检查等 https://github.com/mre/awesome-static-analysis

    关于逆向的图书、培训、实战、工具等 https://github.com/tylerhalfpop/awesome-reversing

    常见软件、类库、书籍、技术分析、开发等 https://github.com/onethawt/reverseengineering-reading-list

    awesome-firmware-security是一个平台固件资源的列表,立足于安全和测试 https://github.com/PreOS-Security/awesome-firmware-security

    Binary Analysis Platform https://github.com/BinaryAnalysisPlatform/bap

    libsodium for Universal Windows Platform (UWP) - A secure cryptographic library https://github.com/charlesportwoodii/libsodium-uwp

    oletools - python tools to analyze MS OLE2 files https://github.com/decalage2/oletools

    chipwhisperer -- toolchain for side-channel power analysis and glitching attacks https://github.com/newaetech/chipwhisperer

    OCI (Open Containers Initiative) compatible runtime for Intel® Architectur https://github.com/01org/cc-oci-runtime

    ICS Security Tools, Tips, and Trade https://github.com/ITI/ICS-Security-Tools

    展开全文
  • HACKing三部曲 ...《c++反汇编与逆向分析技术揭秘》》 《加密与解密4》? 《恶意代码分析实战》 《0day安全:软件漏洞分析技术》 《漏洞战争》 fuzz test 模糊测试 PE文件格式 PE文件(Portable Exec...

    HACKing三部曲

    • 理解系统
      • 系统性的基础课程学习,深入理解计算机系统的运作机制
    • 破坏系统
      • 学习与创作漏洞挖掘与利用技巧
    • 重构系统
      • 设计与构建系统防护

    《汇编语言》

    《c++反汇编与逆向分析技术揭秘》》
    《加密与解密4》?

    《恶意代码分析实战》

    《0day安全:软件漏洞分析技术》
    《漏洞战争》

    fuzz test 模糊测试

    PE文件格式

    PE文件(Portable Executable)
    常见的可执行文件如.exe和.dll文件都是典型的PE文件

    PE文件格式把可执行文件分成若干个数据节,不同的资源被放在不同的节中。

    • .text 包含了CPU执行指令,所有其他节存储数据和支持性信息。一般来说这是唯一可以执行的节,也应该是唯一包含代码的节。
    • .rdata通常包含导入与导出函数信息,与Dependency Walker和PEview工具所获得的信息是相同的,这个节中还可以存储程序所使用的其他只读函数。有些文件还会包含.idata和edata节来存储导入导出信息。
    • .data 初始化的数据块,如宏定义,全局变量,静态变量
    • .idata 可执行文件所使用的动态链接库等外来函数与文件的信息
    • .rsrc 存放程序的资源,如图标菜单
    • .reloc
    • .edata
    • .tls
    • .rdata

    内存

    windows的内存被分为两个层面:物理内存和虚拟内存。其中,物理内存十分复杂,需要进入windows的内核级别ring0才可以看到。通常在用户模式下,我们用调试器看到的内存地址都是虚拟内存。

    PE文件与虚拟内存之间的映射

    • 静态反汇编工具看到的PE文件中某条指令的位置是相对于磁盘文件而言的,即所谓的文件偏移,我们可能还需要知道这条指令在内存中所处的位置,即虚拟内存地址。

    • 反之,在调试时看到某条指令的地址是虚拟内存地址,我们也经常回到PE文件中找到这条指令对应的机器码。

    • 文件偏移地址(File Offset):数据在PE文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏移。(文件地址)

    • 装载地址(Image Base):PE装入内存时的基地址。默认情况下,EXE文件在内存中的基地址为0x00400000, DLL文件基地址为0x10000000,装载地址可以进行修改。

    • 虚拟内存地址(VA):PE文件中指令被装入内存后的地址。

    • 相对虚拟地址(RVA):相对虚拟地址是内存地址相对于映射基址的偏移量。RVA = VA - Image Base

    几个注意事项

    1. 文件的偏移是相对于文件开始处0字节的偏移,RVA则是相对于转载地址0x00400000处的偏移。由于操作系统在进行装载时基本上保持PE中的各种数据结构,所以文件偏移地址和RVA有很大的一致性
    2. 之所以说基本一致,是因为还有一些细微的差异。
    3. PE文件中的数据以0x200字节为基本单位,因此PE数据节的大小永远是0x200的倍数。
    4. 当代码装入内存中,将按照内存数据标准存放,并以0x1000字节为基本单位。故内存中的节总是0x1000的整数倍。
    5. 我们把这种存储单位差异引起的节基址称作节偏移。
    6. 节偏移 = 相对虚拟偏移量RVA-文件偏移量
    7. 文件偏移地址 = RVA - 节偏移 = VA - Image Base -节偏移
    • DLL动态链接库文件
    • EXE可执行文件

    静态分析基础

    网络扫描

    上传至virustotal等网站,调用多个反病毒引擎进行扫描

    通过计算哈希值,确定恶意代码的指纹

    windows中有md5deep、winmd5等工具

    查找字符串

    在字符串中进行搜索存在的字符

    • window函数名通常以大写字母开始的一个词开头,后面的每个词也以大写字母开始

    加壳和混淆恶意代码

    • 混淆程序是恶意代码编写者尝试去隐藏其执行过程的代码
    • 加壳程序则是混淆程序中的一类,加壳后的恶意程序会被压缩,并且难以分析。
    • 至少包含LoadLibrary和GetProcAddress函数,用来加载和使用其他函数功能的。
    • 加壳程序运行时,会首先运行一小段脱壳代码,来解压加壳的文件,然后再运行脱壳后的文件
    • 当静态分析加壳程序时,只有脱壳代码可以被解析,如下图所示:
    • PEid工具:减策加壳器的类型,或者用来连接应用程序的编译器类型,

    连接方式

    • 静态链接
    • 运行时链接
    • 动态链接
    • 静态链接再windows平台不常用,但在unix和linux是常用的,当一个库被静态链接到可执行程序时,所有这个库中的代码都会被复制到可执行程序中,这会让可执行程序增大很多,而在分析代码时,很难区分静态链接的代码与可执行程序自身代码,因为PE文件头中没有迹象表明这个文件包含有链接代码。
    • 使用运行时链接的可执行程序,只有当需要使用函数时,才链接到库,而不是像动态连接模式那样在程序启动时就会链接。
    • LoadLirary和GetProcAddress允许一个程序访问系统上任何库的任何函数,这意味着当这些函数被使用时,你无法静态分析出可以样本程序中会链接哪些函数
    • 动态链接是最常见的,在装载时搜索库函数

    导出函数

    • 与导入函数类似,DLL和EXE的导出函数,是用来与其他程序和代码进行交互时所使用的,通常一个DLL会实现一个或多个功能函数,然后将他们导出,使得别的程序可以导入并使用这些函数。
    • DLL文件本身就是实现一些导出函数然后被EXE可执行文件所使用的,因此导出函数在DLL文件中是最常见的

    当你不知道一个函数有什么功能的时候,需要对其查询,可以在MSDN库中进行搜索

    一个很老的编译时间意味着古老的攻击,反病毒软件就可能包含这个恶意代码的检测特征,而一个很新的编译时间意味的情况则正好相反。(IMAGE_FILE_HEADER中的TIME DATE STAMP)

    但所有的Delphi程序都使用统一的编译时间,1992.6.19,如果是这个则很可能是Delphi程序

    • IMAGE_OPTIONAL_HEADER部分包含几个重要信息:
    • 子系统Subsystem描述指出是一个控制台程序还是图形界面程序
    • 控制台的值为IMAGE_SUBSYSTEM_WINDOWS_CUI, 图形界面为GUI
    • 当text分节在内存占有空间比在磁盘更大一些时,极有可能为加壳代码的存在

    展开全文
  • Linux二进制文件操作工具

    千次阅读 2020-05-19 12:09:48
    1 快速查看工具 可以利用file和size来简单直接的查看二进制文件的细节。 1.1 file ...ldd命令可以显示出二进制文件启动时需要静态加载的动态库的完整列表(加载时依赖项)。 链接器会将直接依赖项的列
  • Linux提供了丰富的工具集,可轻松进行二进制分析! 无论您的工作角色是什么,如果您在Linux上工作,了解有关这些工具的基础知识将有助于您更好地了解系统。 在本文中,我们将介绍这些Linux工具和命令中最流行的...
  • Manticore是一个用于动态二进制分析的原型设计工具,支持符号执行、污染分析二进制检测
  • iOS 二进制文件分析之常用命令 一、背景介绍 最近新版本审核时被拒了,Apple给出的原因是使用到了Intents的功能,但是Info.plist中并未给出使用简介导致被拒。由于我们的App并不需要使用Intents等能力,所以...
  • 用于高效二进制级别覆盖率分析工具。 bcov在没有编译器支持的情况下静态地检测x86-64 ELF二进制文件。它具有探针修剪,精确的CFG分析和复杂的仪器技术的功能。我们总结了本研究在2分钟预告片。 资源 有关详细信息...
  • 具有自定义补丁的支持静态分析 用于单元测试 用户界面的 进行漂亮的印刷拆卸 的Ubuntu sudo ./install_deps.sh ./make.sh OS X brew update && brew install cmake boost protobuf git ./install_vex.sh ./make.sh...
  • 静态分析:不运行目标程序,分析代码 动态分析:运行时分析 静态分析: 1、阅读反汇编代码 2、提取可执行文件中的字符串,分析使用了哪些单词 3、二进制编辑器查看可执行文件内容 作者认为的逆向工程四大件: 二进制...
  • 一 : objdump: 功能最丰富的二进制分析工具。 /usr/local/linaro-armv8l-eabi-2017.08-gcc7.1/bin/arm-eabi-objdump -D -S libnetx.a > a.s objdump -x -j .bss demoApp,对bss节进行反汇编操作。 注意如果是...
  • Linux 二进制分析

    千次阅读 2018-11-06 11:55:21
    二进制分析属于信息安全业界逆向工程中的一种技术,通过利用可执行的机器代码(二进制)来分析应用程序的控制结构和运行方式,有助于信息安全从业人员更好地分析各种漏洞、病毒以及恶意软件,从而找到相应的解决方案...
  • 二进制工具

    2019-09-24 21:25:18
    linux上的动态调试工具gdb 现在的pwn题很多都是linux下的程序,因此学会gdb的调试是做pwn题必不可少的,现在简单介绍一下gdb的使用,gdb下有个很好的插件peda,可以安装一下。 例子: #include<stdio.h> #...
  • Linux 系统中有大量的工具可用于 ELF 文件的二进制调试,常用的工具在 GNU binutils 包中可以找到,注意你可能需要这些工具的 x86 版本和 arm 版本,以便在调试环境中能够调试 x86 ELF 文件和 arm ELF 文件——与...
  • 0x00 本文是本系列的第二篇,将对面向二进制程序的静态漏洞挖掘技术进行介绍与分析。 面向二进制程序的静态漏洞的挖掘技术由于缺少源代码中...值集分析是一种结合数值分析和指针分析的静态分析算法。VSA是一种基于抽象
  • Windows下使用二进制插装工具Pin

    千次阅读 2013-05-21 14:19:40
    Pin是Intel公司提供的一个程序插装工具,支持IA-32,Intel(R) 64和IA64架构上的Linux和Windows可执行程序。 Pin允许一个工具在可执行程序的任何地方插入任意代码(用C或C++编写)。这些代码在程序运行的时候动态...
  • “Karta”(在俄语中的意思是“map”)是IDA(一个静态反编译程序)的源代码辅助二进制对比插件,该插件的开发是为了对比一个非常大的二进制文件(通常是固件文件)中的开源库的符号。对于那些每天都要处理固件文件...
  • 对于嵌入式系统开发,掌握相应的工具至关重要,它能使我们解决问题的效率大大提高。目前,可以说嵌入式系统的开发工具是GNU的天下,因为来自GNU的GCC编译器支持大量的目标处理器。除了GCC,还有一个非常重要的、同样...
  • 在研究项目AnaStaSec中,AMOSSYS提供了许多关于如何静态检测二进制代码中的此类漏洞的介绍。在这篇博文中,我们将向读者阐述学术界在如何检测这种类型的漏洞方面提出的各种建议。当然,他们当前的目标是定义一种通用...
  • 关于Linux常用的二进制文件分析方法

    千次阅读 2011-06-22 10:58:00
    当你在unix下拿到一个二进制文件但不知道它是什么的时候,可以通过以下方法得到一此提示 1、 最首先应该尝试strings命令,比如拿到一个叫cr1的二进制文件,可以: $ strings cr1 | more 里面可能会有一些对于这个cr1...
  • 常用的反汇编工具一般需要执行三个步骤,1,加载要反汇编的二进制文件;2,从二进制文件中找到所有机器指令;3,将指令转换为汇编语句;通常第2步是一个难点,由于机器指令与通常的二进制数值无异,因此很容易把不是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,581
精华内容 25,432
关键字:

二进制静态分析工具