精华内容
下载资源
问答
  • linux二进制文件分析 “这个世界上有十​​种人:懂二进制的人和不懂二进制的人。” Linux提供了丰富的工具集,可轻松进行二进制分析! 无论您的工作角色是什么,如果您在Linux上工作,了解有关这些工具的基础知识...

    linux二进制文件分析

    “这个世界上有十​​种人:懂二进制的人和不懂二进制的人。”

    Linux提供了丰富的工具集,可轻松进行二进制分析! 无论您的工作角色是什么,如果您在Linux上工作,了解有关这些工具的基础知识将有助于您更好地了解系统。

    在本文中,我们将介绍这些Linux工具和命令中最流行的一些,其中大多数将作为Linux发行版的一部分本地提供。 如果没有,您可以随时使用软件包管理器来安装和浏览它们。 请记住:在正确的场合学习使用正确的工具需要足够的耐心和练习。

    文件

    作用:帮助确定文件类型。

    这将是您进行二进制分析的起点。 我们每天处理文件。 并非所有的东西都是可执行的类型。 那里有各种各样的文件类型。 在开始之前,您需要了解要分析的文件类型。 它是二进制文件,库文件,ASCII文本文件,视频文件,图片文件,PDF,数据文件等吗?

    file命令将帮助您确定要处理的确切文件类型。

    
       
    $ file /bin/ls
    /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=94943a89d17e9d373b2794dcb1f7e38c95b66c86, stripped
    $
    $ file /etc/passwd
    /etc/passwd: ASCII text
    $

    dd

    它的作用:打印共享对象依赖性。

    如果您已经在可执行二进制文件上使用了上面的file命令,则不能错过输出中的“动态链接”消息。 这是什么意思?

    开发软件时,我们尽量不要重新发明轮子。 大多数软件程序需要执行一组通用任务,例如打印输出或从标准文件中读取或打开文件等。所有这些通用任务都通过一组通用函数抽象出来,每个人都可以使用它们代替编写自己的变体。 这些常用功能放在名为libcglibc的库中。

    如何找到可执行文件所依赖的库? 这就是ldd命令出现的地方。 针对动态链接的二进制文件运行它会显示其所有依赖的库及其路径。

    
       
    $ ldd /bin/ls
            linux-vdso.so.1 =>  (0x00007ffef5ba1000)
            libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fea9f854000)
            libcap.so.2 => /lib64/libcap.so.2 (0x00007fea9f64f000)
            libacl.so.1 => /lib64/libacl.so.1 (0x00007fea9f446000)
            libc.so.6 => /lib64/libc.so.6 (0x00007fea9f079000)
            libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fea9ee17000)
            libdl.so.2 => /lib64/libdl.so.2 (0x00007fea9ec13000)
            /lib64/ld-linux-x86-64.so.2 (0x00007fea9fa7b000)
            libattr.so.1 => /lib64/libattr.so.1 (0x00007fea9ea0e000)
            libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fea9e7f2000)
    $

    跟踪

    它的作用:库调用跟踪器。

    现在,我们知道如何使用ldd命令查找可执行程序所依赖的库。 但是,一个库可以包含数百个函数。 在这数百种中,二进制文件实际使用的功能是什么?

    ltrace命令显示在运行时从库中调用的所有函数。 在下面的示例中,您可以看到调用的函数名称以及传递给该函数的参数。 您还可以在输出的最右侧看到这些函数返回的内容。

    
       
    $ ltrace ls
    __libc_start_main(0x4028c0, 1, 0x7ffd94023b88, 0x412950 <unfinished ...>
    strrchr("ls", '/')                                                                  = nil
    setlocale(LC_ALL, "")                                                               = "en_US.UTF-8"
    bindtextdomain("coreutils", "/usr/share/locale")                                    = "/usr/share/locale"
    textdomain("coreutils")                                                             = "coreutils"
    __cxa_atexit(0x40a930, 0, 0, 0x736c6974756572)                                      = 0
    isatty(1)                                                                           = 1
    getenv("QUOTING_STYLE")                                                             = nil
    getenv("COLUMNS")                                                                   = nil
    ioctl(1, 21523, 0x7ffd94023a50)                                                     = 0
    << snip >>
    fflush(0x7ff7baae61c0)                                                              = 0
    fclose(0x7ff7baae61c0)                                                              = 0
    +++ exited (status 0) +++
    $

    十六进制转储

    作用:以ASCII,十进制,十六进制或八进制显示文件内容。

    通常,您使用不知道如何处理该文件的应用程序打开文件。 尝试使用vim打开可执行文件或视频文件; 您将看到的只是乱码在屏幕上。

    在Hexdump中打开未知文件可帮助您查看文件中包含的内容。 您也可以使用某些命令行选项选择查看文件中数据的ASCII表示形式。 这可能有助于您了解文件的类型。

    
       
    $ hexdump -C /bin/ls | head
    00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
    00000010  02 00 3e 00 01 00 00 00  d4 42 40 00 00 00 00 00  |..>......B@.....|
    00000020  40 00 00 00 00 00 00 00  f0 c3 01 00 00 00 00 00  |@...............|
    00000030  00 00 00 00 40 00 38 00  09 00 40 00 1f 00 1e 00  |....@.8...@.....|
    00000040  06 00 00 00 05 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
    00000050  40 00 40 00 00 00 00 00  40 00 40 00 00 00 00 00  |@.@.....@.@.....|
    00000060  f8 01 00 00 00 00 00 00  f8 01 00 00 00 00 00 00  |................|
    00000070  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |................|
    00000080  38 02 00 00 00 00 00 00  38 02 40 00 00 00 00 00  |8.......8.@.....|
    00000090  38 02 40 00 00 00 00 00  1c 00 00 00 00 00 00 00  |8.@.............|
    $

    它的作用:打印文件中可打印字符的字符串。

    如果Hexdump在您的用例中看起来有点过大,而您只是在二进制文件中寻找可打印的字符,则可以使用strings命令。

    开发软件时,会向其中添加各种文本/ ASCII消息,例如打印信息消息,调试信息,帮助消息,错误等。 只要所有这些信息都存在于二进制文件中,它将使用字符串转储到屏幕上。

     $ strings /bin/ls 
    

    Readelf

    它的作用:显示有关ELF文件的信息。

    ELF(可执行文件和可链接文件格式)是可执行文件或二进制文件的主要文件格式,不仅在Linux上,在各种UNIX系统上也是如此。 如果您使用过诸如file命令之类的工具,该工具会告诉您该文件为ELF格式,那么下一个逻辑步骤将是使用readelf命令及其各种选项来进一步分析该文件。

    使用readelf时,方便参考实际的ELF规范非常有用。 您可以在此处找到规格。

    
       
    $ readelf -h /bin/ls
    ELF Header:
      Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
      Class:                             ELF64
      Data:                              2's complement, little endian
      Version:                           1 (current)
      OS/ABI:                            UNIX - System V
      ABI Version:                       0
      Type:                              EXEC (Executable file)
      Machine:                           Advanced Micro Devices X86-64
      Version:                           0x1
      Entry point address:               0x4042d4
      Start of program headers:          64 (bytes into file)
      Start of section headers:          115696 (bytes into file)
      Flags:                             0x0
      Size of this header:               64 (bytes)
      Size of program headers:           56 (bytes)
      Number of program headers:         9
      Size of section headers:           64 (bytes)
      Number of section headers:         31
      Section header string table index: 30
    $

    objdump

    它的作用:显示来自目标文件的信息。

    当您编写源代码时,会创建二进制文件,而使用称为编译器的工具对源代码进行编译也就不足为奇了。 该编译器生成与源代码等效的机器语言指令,然后可由CPU执行以执行给定任务。 可以通过称为汇编语言的助记符来解释该机器语言代码。 汇编语言是一组指令,可以帮助您了解程序正在执行的操作以及最终在CPU上执行的操作。

    objdump实用程序读取二进制或可执行文件,并将汇编语言指令转储到屏幕上。 汇编知识对于理解objdump命令的输出至关重要。

    请记住:汇编语言是特定于体系结构的。

    
       
    $ objdump -d /bin/ls | head

    /bin/ls:     file format elf64-x86-64


    Disassembly of section .init:

    0000000000402150 <_init@@Base>:
      402150:       48 83 ec 08             sub    $0x8,%rsp
      402154:       48 8b 05 6d 8e 21 00    mov    0x218e6d(%rip),%rax        # 61afc8 <__gmon_start__>
      40215b:       48 85 c0                test   %rax,%rax
    $

    痕迹

    它的作用:跟踪系统调用和信号。

    如果您使用了前面提到的ltrace ,请考虑strace是相似的。 唯一的区别是, strace实用程序可以跟踪系统调用,而不是调用库。 系统调用是您与内核交互以完成工作的方式。

    举个例子,如果您想在屏幕上打印一些东西,您将使用标准库libc中printfputs函数; 但是,在幕后,最终将进行名为write的系统调用,以将某些内容实际打印到屏幕上。

    
       
    $ strace -f /bin/ls
    execve("/bin/ls", ["/bin/ls"], [/* 17 vars */]) = 0
    brk(NULL)                               = 0x686000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f967956a000
    access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
    open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=40661, ...}) = 0
    mmap(NULL, 40661, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9679560000
    close(3)                                = 0
    << snip >>
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9679569000
    write(1, "R2  RH\n", 7R2  RH
    )                 = 7
    close(1)                                = 0
    munmap(0x7f9679569000, 4096)            = 0
    close(2)                                = 0
    exit_group(0)                           = ?
    +++ exited with 0 +++
    $

    纳米

    它的作用:列出目标文件中的符号。

    如果您使用的是未剥离的二进制文件,那么nm命令将为您提供在编译过程中嵌入在二进制文件中的有价值的信息。 nm可以帮助您从二进制文件中识别变量和函数。 您可以想象如果您无法访问所分析的二进制代码的源代码,这将有多大用处。

    为了展示nm ,我们将快速编写一个小程序并使用-g选项对其进行编译,并且还将看到使用file命令不会剥离二进制文件。

    
       
    $ cat hello.c
    #include <stdio.h>

    int main() {
        printf("Hello world!");
        return 0;
    }
    $
    $ gcc -g hello.c -o hello
    $
    $ file hello
    hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=3de46c8efb98bce4ad525d3328121568ba3d8a5d, not stripped
    $
    $ ./hello
    Hello world!$
    $


    $ nm hello | tail
    0000000000600e20 d __JCR_END__
    0000000000600e20 d __JCR_LIST__
    00000000004005b0 T __libc_csu_fini
    0000000000400540 T __libc_csu_init
                     U __libc_start_main@@GLIBC_2.2.5
    000000000040051d T main
                     U printf@@GLIBC_2.2.5
    0000000000400490 t register_tm_clones
    0000000000400430 T _start
    0000000000601030 D __TMC_END__
    $

    gdb

    它的作用:GNU调试器。

    好吧,并不是二进制文件中的所有内容都可以静态分析。 我们确实执行了一些运行二进制文件的命令,例如ltracestrace ; 但是,软件包含多种条件,可能导致执行各种替代路径。

    分析这些路径的唯一方法是在运行时通过能够在任何给定位置停止或暂停程序,并能够分析信息然后进一步向下移动来进行分析。
    这就是调试器出现的地方,在Linux上, gdb是事实上的调试器。 它可以帮助您加载程序,在特定位置设置断点,分析内存和CPU寄存器等等。 它补充了上面提到的其他工具,使您可以进行更多的运行时分析。

    需要注意的一件事是,一旦使用gdb加载了程序,就会看到它自己的(gdb)提示符。 所有其他命令将在此gdb命令提示符下运行,直到退出。

    我们将使用我们先前编译的“ hello”程序,并使用gdb查看其工作方式。

    
       
    $ gdb -q ./hello
    Reading symbols from /home/flash/hello...done.
    (gdb) break main
    Breakpoint 1 at 0x400521: file hello.c, line 4.
    (gdb) info break
    Num     Type           Disp Enb Address            What
    1       breakpoint     keep y   0x0000000000400521 in main at hello.c:4
    (gdb) run
    Starting program: /home/flash/./hello

    Breakpoint 1, main () at hello.c:4
    4           printf("Hello world!");
    Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.6.x86_64
    (gdb) bt
    #0  main () at hello.c:4
    (gdb) c
    Continuing.
    Hello world![Inferior 1 (process 29620) exited normally]
    (gdb) q
    $

    结论

    一旦您对使用这些本机Linux二进制分析工具感到满意,并理解了它们提供的输出,就可以使用更高级和专业的开源二进制分析工具,例如radare2

    翻译自: https://opensource.com/article/20/4/linux-binary-analysis

    linux二进制文件分析

    展开全文
  • ROS二进制日志包 ROS binary logger package

    千次阅读 2017-02-09 13:43:46
    原文网址:1 http://www.ros.org/news/2017/02/ros-binary-logger-package.html2 ...该包装设计为rosbag的替代品,当下列情况时:需要多个和长消息采集(二进制文件具有较小的尺寸)仅需要离线数据分析,并且在RO

    原文网址:

    http://www.ros.org/news/2017/02/ros-binary-logger-package.html

    https://github.com/CNR-ITIA-IRAS/binary_logger

    我们想宣布发布新的ROS二进制记录器包。该包装设计为rosbag的替代品,当下列情况时:

    1. 需要多个和长消息采集(二进制文件具有较小的尺寸)
    2. 仅需要离线数据分析,并且在ROS中不需要实验的重放(例如使用MATLAB的数据分析)

    二进制文件的使用允许减少日志文件的大小,并允许加快这些文件的后处理(例如,MATLAB花费〜0.1s来解压缩300MB的二进制文件)。该软件包可以记录一些常见的ROS消息,如:传感器msgs/ IMU,传感器的msg / JointState,geometry_msgs / WrenchStamped,等等新信息类型可以很容易地添加和鼓励用户作出贡献。还提供了两个MATLAB脚本来解包二进制文件。

    你可以在这里找到的代码:https://github.com/CNR-ITIA-IRAS/binary_logger 更多的信息和一个简短的描述可以在资源库中找到。

    联系人:Manuel Beschi manuel.beschi@itia.cnr.it - Enrico Villagrossi enrico.villagrossi@itia.cnr.it


    CNR-ITIA的二进制记录器包(www.itia.cnr.it

    存储库包含由意大利国家研究委员会(CNR-ITIA)的工业技术和自动化研究所开发的ROS二进制记录器的实现。

    概述

    该包提供了获取ROS主题的所有功能,并将数据存储到二进制文件中。

    目标是减少存储文件的尺寸(如果与.bag文件相比),以便进行长时间数据采集,并加快日志文件分析(例如,MATLAB花费〜0.1s来解压300MB的二进制文件)。

    可以记录的消息类型(目前)为:

    • 'JointState'

    • 'Imu'

    • 'PoseStamped'

    • '扳手'

    • 'Float64MultiArray'

    安装和支持的ROS版本

    下载并编译软件包(没有特定的依赖关系,只需要ROS标准安装)。

    该软件包已经用ROS'Jade'和'Kinetic'测试。

    用法

    要获得一个新的主题,它需要:

    1)定义主题特征(消息类型,持续时间,抽取)和二进制文件特性(二进制文件名,路径)到'cfg / binary_logger_cfg.yaml'(更多信息报告在文件内)。

    2)启动文件“launch / binary_logger.launch”开始记录数据(注意:如果主题不可用,记录器将等待主题);

    MATLAB

    该软件包还提供了在MATLAB中解码二进制文件的脚本。更多详细信息在脚本README中报告

    添加新的记录器功能

    包是一个开源项目,鼓励用户添加和共享新的功能,引入新的消息类型。

    要添加新消息类型,需要:

    1)为新消息类型添加一个新的头文件到“include / binary_logger /”文件夹(使用现有文件作为示例);

    2)将对应的.cpp文件添加到'src / binary_logger /'foder(使用现有文件作为示例。需要做的主要更改是在处理回调的类方法中)。

    注意:新的.cpp需要添加到CMakeLists.txt;

    3)将新消息类型添加到'binary_logger_plugins.xml';

    结果从联合状态消息的10分钟的日志提供为:

    标题:

    seq:16505 
    邮票:

    secs:1486559122 nsecs 
    :461230839

    frame_id:''

    name:['joint_0','joint_1','joint_2','joint_3','joint_4','joint_5'] 
    position:[ 0.0,0.0,0.0,0.0,0.0,0.0 
    velocity:[ 0.0,0.0,0.0 ,0.0,0.0,0.0] 
    effort:[0.0,0.0,0.0,0.0,0.0,0.0]

    提供以下结果:

    1)录制文件的大小:

    • .bag文件的大小为180.0MB

    • 91.0MB fot的.bin文件

    2)在MATLAB中加载文件的时间:

    • 8.215872 [s]为.bag文件

    • 0.391143 [s]为.bin文件

    开发人员联系人

    作者:

    软件许可协议(BSD许可证)版权所有(c)2016,意大利国家研究委员会,工业技术与自动化研究所。版权所有。


    展开全文
  • Binary Bomb 二进制炸弹

    千次阅读 2019-01-14 17:36:54
     二进制炸弹   计算机科学与技术学院   目 录   第1章 实验基本信息... - 3 - 1.1 实验目的... - 3 - 1.2 实验环境与工具... - 3 - 1.2.1 硬件环境... - 3 - 1.2.2 软件环境... - 3 - 1.2.3...

     

    实验报告

     

    验(三)

    题     目  Binary Bomb       

      二进制炸弹     

     

    计算机科学与技术学院

     

    目  录

     

    第1章 实验基本信息... - 3 -

    1.1 实验目的... - 3 -

    1.2 实验环境与工具... - 3 -

    1.2.1 硬件环境... - 3 -

    1.2.2 软件环境... - 3 -

    1.2.3 开发工具... - 3 -

    1.3 实验预习... - 3 -

    第2章 实验环境建立... - 4 -

    2.1 Ubuntu下CodeBlocks反汇编(10分)... - 4 -

    2.2 Ubuntu下EDB运行环境建立(10分)... - 4 -

    第3章 各阶段炸弹破解与分析... - 5 -

    3.1 阶段1的破解与分析... - 5 -

    3.2 阶段2的破解与分析... - 5 -

    3.3 阶段3的破解与分析... - 5 -

    3.4 阶段4的破解与分析... - 5 -

    3.5 阶段5的破解与分析... - 5 -

    3.6 阶段6的破解与分析... - 5 -

    3.7 阶段7的破解与分析(隐藏阶段) - 6 -

    第4章 总结... - 7 -

    4.1 请总结本次实验的收获... - 7 -

    4.2 请给出对本次实验内容的建议... - 7 -

    参考文献... - 8 -

     

     

     

     

    第1章 实验基本信息

     

      1. 实验目的

    1.熟练掌握计算机系统的ISA指令系统与寻址方式

    2.熟练掌握Linux下调试器的反汇编调试跟踪分析机器语言的方法

    3.增强对程序机器级表示、汇编语言、调试器和逆向工程等的理解

    1.2 实验环境与工具

    1.2.1 硬件环境

    X64 CPU;2GHz;2G RAM;256GHD Disk 以上

    1.2.2 软件环境

    Windows7 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位;

    1.2.3 开发工具

    GDB/OBJDUMP;EDB;KDD等

    1.3 实验预习

    上实验课前,必须认真预习实验指导书(PPT或PDF)

    了解实验的目的、实验环境与软硬件工具、实验操作步骤,复习与实验有关的理论知识。

    请写出C语言下包含字符串比较、循环、分支(含switch)、函数调用、递归、指针、结构、链表等的例子程序sample.c。

    生成执行程序sample.out。

    用gcc –S或CodeBlocks或GDB或OBJDUMP等,反汇编,比较。

    列出每一部分的C语言对应的汇编语言。

    修改编译选项-O (缺省2)、O0、O1、O2、O3,-m32/m64。再次查看生成的汇编语言与原来的区别。

    注意O1之后无栈帧,EBP做别的用途。-fno-omit-frame-pointer加上栈指针。

    GDB命令详解 –tui模式 ^XA切换  layout改变等等

    有目的地学习: 看VS的功能GDB命令用什么?

     

     

     

    第2章 实验环境建立

     

    2.1 Ubuntu下CodeBlocks反汇编(10分)

    CodeBlocks运行hellolinux.c。反汇编查看printf函数的实现。

    要求:C、ASM、内存(显示hello等内容)、堆栈(call printf前)、寄存器同时在一个窗口。

     

     

     

     

     

     

     

     

    图2-1  Ubuntu下CodeBlocks反汇编截图

     

    2.2 Ubuntu下EDB运行环境建立(10分)

    用EDB调试hellolinux.c的执行文件,截图,要求同2.1

     

     

     

     

     

     

    图2-2  Ubuntu下EDB截图

     

     

     

    第3章 各阶段炸弹破解与分析

    每阶段15分(密码10分,分析5分),总分不超过80分

    3.1 阶段1的破解与分析

    密码如下:Why make trillions when we could make... billions?

    破解过程:strings_not_equal函数是判断输入的字符串和%rsi中的字符串是否相等,如果相等则令%eax为0,否则为1。

    并且后面的test  %eax,%eax和jne  0x55555555518d则是判断若%eax不为0,就执行explode_bomb。因此需要输入的密码必须与%rsi中的字符串相等。

    gdb通过x/s 0x555555556670查看其中的数据,即得密码。

    3.2 阶段2的破解与分析

    密码如下:其中一组密码为:0 1 3 6 10 15

    破解过程:第一步:phase_2的代码需要输入6个数字,并且当我进入read_six_numbers函数,通过查看%rsi时,发现其为%d %d %d %d %d %d,由此可知,函数读入的数据是6个int类型,这对栈的分析至关重要。

      第二步:查看函数phase_2。通过cmpl   $0x0,(%rsp)和后一句js条件跳转语句可以分析第一个数大于等于0。暂且输入第一个数为0。%ebx的值由0x1执行循环,每次加0x1,当%ebx为0x6时退出循环。每次循环,将%ebx赋值给%eax。分析主要的语句可以得出每次循环内,%eax+(4%rbx-4+%rbp)与(4%rbx+%rbp)的值相等,而(4%rbx-4+%rbp)取址后为上一个输入的值,(4%rbx+%rbp)为本次输入的值。由此不难得出函数的循环大致为:

     

     

     int a[6];

     a[0]=0;

     for (i=1;i<6;i++)

    {  a[i]=a[i-1]+I ;  }

    附上此时栈的示意图:

    3.3 阶段3的破解与分析

    密码如下:其中一组密码为:2 44

    破解过程:

    通过查看%rsi中的字符,可知输入的是两个int型数据。sscanf返回值为读入有效数据的个数,并且由$0x7,0xc(%rsp)可知,第一个数小于7。

    于是先输入2 2,使用gdb观察下面的执行。

    观察到jmpq   *%rax语句,表示以%rax中的值作为跳转目标,此时查看%rax中十六进制的值如下:

    因此jmp   *rax即表示跳转到0x55555555526d,再单步执行程序。

    跳转到0x55555555526d后,mov  $0x0,%eax  表示将%rax赋值为0x0后再跳转到0x555555555238进行计算。

    由cmpl  $0x5 , 0xc(%rsp)和jg  0x555555555263可知第一个值为小于5的无符号数,而第二个数值等于计算后%eax中的值。

    计算过程是从地址0x555555555238开始:

    0+0x246-0x21a+0x21a-0x21a+0x21a -0x21a =44,因此第一个数输入2时,第二个数为44.

    综上,此题其实是一条switch语句,根据输入小于5的第一个数值,可计算出 *%rax,即跳转的地址,然后计算求出第二个数值,即得通关密码。

    3.4 阶段4的破解与分析

    密码如下:8 35

    破解过程:

    第一步,先观察调用func4之前的phase_4,通过查看%rsi,和调用__isoc99_sscanf时返回值为2可以知道,我们输入的是两个int型数据,并且由cmpl  $0xe,0xc(%rsp) 和 jbe  0x555555555307可以知道输入的第一个数小于14,进入func4之前%edx被赋值为14,%esi被赋值为0,%edi被赋值为我们输入的第一个数。

    第二步,观察func4调用之后的phase_4,可以知道输入的第二个数是35,并且fun4的返回值%eax也是35。

    第三步,进入func4查看。

    通过对上语句的分析,我将func简化为如下形式:

    %edx初值为14,%esi初值为0,

    x=%rbx, y=%eax, z=%edx, a=%esi, a1=%edi

    <fun4>

    y=z ;

    x=(y+a)/2;

    1 .if (x>a1)

    z=x-1

    call <func4>

    y+=x;

     

    2 .if (x<a1)

     a =x+1;

    call<fun4>

    y+=x;

    3 .if (x=a1)

    y=x;

    由以上简化的调用形式可知,递归的最里层是x=a1,由于每次调用<fun4>之前都要pop %rbx,因此递归返回计算时x的值是不断变化的。

    返回值%rax,即设置的y,有y= a1 +x1 +x2 +x3…

    进行多次计算如下:

    %edi = 0 , %rax = 11

    %edi = 1 , %rax = 11

    %edi = 2, %rax = 13

    %edi = 3 , %rax = 10

    %edi = 4 , %rax = 19

    %edi = 5 , %rax = 15

    %edi = 6 , %rax = 21

    %edi = 7 , %rax = 7

    %edi = 8 , %rax = 35

    %edi = 9 , %rax = 27

    %edi = 10 , %rax = 37

    %edi = 11 , %rax = 18

    %edi = 12 , %rax = 43

    %edi = 13 , %rax = 31

    %edi = 14 , %rax = 45

    由返回值%eax为35可以知道输入第一个数为8。综上,输入8  35.

    3.5 阶段5的破解与分析

    密码如下:其中一组为444440

    破解过程:

    首先通过string_length函数,及cmp    $0x6,%eax语句,可知密码为长度为6的字符串。

    再由movzbl (%rax),%edx及and    $0xf,%edx可知,将输入字符0拓展为32为赋值给%edx再取%edx的后四位。

    另外,%rax每次加一,cmp    %rdi,%rax条件判断语句控制循环。

    其中最重要的是add    (%rsi,%rdx,4), %ecx,这条语句是指将(%rsi+4%rdx)该地址对应的值赋给%ecx,于是gdb调试出当%rdx分别为0,1,2,3,4,时,(%rsi+4%rdx)地址对应的值:

    由于输出的%ecx的值为62,又根据累加出%ecx的一种计算可以为62=12+12+12+12+12+2,故逆推输入的字符串相对应为444440 。

    3.6 阶段6的破解与分析

    密码如下:1 6 4 5 2 3

    破解过程:第一步:分析前面的的循环可知,read_six_numbers的六个参数,全部不大于6,并且互不相等。

      第二步:

    分析后一个循环可知,输入的6个数,分别被7减,并且保存在原处。

      第三步:根据7减去输入的六个数字的值,通过循环,%rsp+8n中分别存入不同的地址值。存值的方式是循环时不断对新的%rdx加0x8,其中%rdx初始值为0x555555758210

      第四步:

    由此可知,链表值由大到小排列。

      第五步:

    链表值由大到小排列为:0x39f 0x390 0x30c 0x30b 0x20e 0x123

    对应的值为:6 1 3 2 5 4

    又因为对应的值是7减去输入数后的值。

    故输入的数对应为:1 6 4 5 2 3

    3.7 阶段7的破解与分析(隐藏阶段)

    密码如下:1001

    破解过程:根据phase_defused的分析,可以知道必须解决完前六关才能进入隐藏阶段。

    由以上截图可知,隐藏阶段是在输入两个int型数据后,再输入DrEvil,才可进入。

    首先分析secret_phase,由read_line可知,输入的是一个字符串,并且strtol函数是将一个字符串转化为十进制长整数赋给%rax作为返回值,调用func7之前,%rdi被赋值为36,即第一个参数a1=0x24,a2为要输入的数。再由func7之后,可以知道返回值是0x7.

    观察func7内的语句,核心部分是递归。

    由以上三张截图可知,

    若*a1>a2 , a1=*(a1+8) , call func7 , %eax=%eax*2;

    若*a1<a2 , a1=*(a1+16) , call fun7 , %eax=%eax*2+1;

    若*a1=a2 , 跳出。

    由此可知,最深层的%eax=0,并且如果*a1=a2,则推出最里面的递归条件。

    因为func7执行完后返回值是7,而逆推出7的产生过程为:

    7=((0*2+1)*2+1)*2+1

    则递归时a2=*(*(*(a1+0x10)+0x10)+0x10)

    再用gdb调试,可知a2=0x3e9,即1001。

    综上可知,输入的密码是1001.

     

     

    第4章 总结

    4.1 请总结本次实验的收获

    1.学会了gdb的调节和各种命令。

    2.对C语言下字符串比较、循环、分支(含switch)、函数调用、递归、指针、结构、链表等有了更深刻的理解。

    3.更加深刻地理解了汇编语言,程序机器级表示以及逆向工程。

    4.2 请给出对本次实验内容的建议

    希望对gdb调试的讲解更加细致一些。

     

    注:本章为酌情加分项。

     

    参考文献

     

    为完成本次实验你翻阅的书籍与网站等

    [1]  林来兴. 空间控制技术[M]. 北京:中国宇航出版社,1992:25-42.

    [2]  辛希孟. 信息技术与信息服务国际研讨会论文集:A集[C]. 北京:中国科学出版社,1999.

    [3]  赵耀东. 新时代的工业工程师[M/OL]. 台北:天下文化出版社,1998 [1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).

    [4]  谌颖. 空间交会控制理论与方法研究[D]. 哈尔滨:哈尔滨工业大学,1992:8-13.

    [5]  KANAMORI H. Shaking Without Quaking[J]. Science,1998,279(5359):2063-2064.

    [6]  CHRISTINE M. Plant Physiology: Plant Biology in the Genome Era[J/OL]. Science,1998,281:331-332[1998-09-23]. http://www.sciencemag.org/cgi/ collection/anatmorp.

    展开全文
  • 计算机中的文件是以二进制编码进行表示的,推荐几个不错的查看一个二进制的工具。 Binary Viewer Ultra-Edit Notepad++

    计算机中的文件是以二进制编码进行表示的,有很多工具都只可以查看。但是这些工具,有的体积比较大(如VS),有的需要配置(如Notepad++),有的需要收费(如UltraEdit),一直没找到一个好用的工具。

    今天无意发现了一款不错的工具 Binary Viewer,与大家分享。主界面如下所求,不需要安装,解压即可使用。体积也很小,只有几百KB。

    下载地址
    https://download.csdn.net/download/weixin_43145361/11186451
    在这里插入图片描述

    展开全文
  • 本篇文章翻译自:(State of) The Art of War: Offensive Techniques in Binary Analysis论文下载链接:http://www.cs.ucsb.edu/~chris/research/doc/oakland16_sokbin.pdf文章主要讲解的是常见的二进制分析技术,...
  • Linux二进制分析

    千次阅读 2017-03-06 20:35:33
    Preface(序言) 软件工程是一种创造发明的行为,该发明在微处理器上存在、生活并且呼吸...我们必须理解二进制格式、内存布局和给定处理器指令集的复杂性。我们因此成为微处理器上的程序的主人。一个逆向工程师对二进制
  • 二进制及代码分析工具

    千次阅读 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://...
  • WinHex一个很不错的16进制文件编辑与磁盘编辑软件。WinHex汉化破解版以文件小、速度快,功能不输其它的Hex十六进位编辑器工具得到了ZDNet Software Library五颗星评价,可做Hex与ASCII码编辑修改,多文件寻替换功能...
  • BitBlaze:一种通过二进制代码分析实现计算机安全的全新方法 Dawn Song,David Brumley,Heng Yin,Juan Caballero,Ivan Jager, Min Gyung Kang,ZhenKai Liang,James Newsome,Pongsin Poosankam, And Prateek ...
  • 代码二进制代码集成Binary Code is a representation format for the different types of data like Text, Image, Video, etc. Binary code is expressed two basic symbols or numbers 1 and 0. Binary code is ...
  • 在上位机上,我们可以编写软件来从串口获得这些来自下位机的二进制文件。通过分析矫正位,头文件等可以从中提取到单片机想传来的有用的信息。这些信息是经过一定协议的。用起来会比较简单。   我们可以看到上图...
  • 二进制工具分析的主要是程序的各种信息,比如格式、体系结构、编译器标识、指令、助记符等。反汇编概览IDA是HexRays公司的商业产品,这个也是大家最熟悉的了。不过我是真的用不起,羡慕那些有钱的实验室还有土豪们啊...
  • Pharos静态二进制分析框架是卡内基梅隆大学软件工程学院的一个项目。 该框架旨在促进二进制程序的自动化分析。 它使用Lawrence Livermore国家实验室开发的ROSE编译器基础结构进行反汇编,控制流分析,指令语义等。 ...
  • RPM二进制

    2019-09-25 18:47:18
    Linux 常见软件包分为两种,分别是源代码包(Source Code)、二进制包(Binary Code),源代码包是没有经过编译的包,需要经过 GCC、C++编译器环境编译或解压才能运行,二进制包无需编译,可以直接安装使用。...
  • MySQL二进制日志

    2021-06-13 09:23:34
    文章目录mysql复制功能解决了什么问题mysql二进制日志二进制日志二进制日志的格式(段)二进制日志的格式(行)二进制日志的格式(混合)mysql二进制日志格式对复制的影响基于SQL语名的复制( SBR )优点缺点基于行的...
  • 用于高效二进制级别覆盖率分析的工具。 bcov在没有编译器支持的情况下静态地检测x86-64 ELF二进制文件。它具有探针修剪,精确的CFG分析和复杂的仪器技术的功能。我们总结了本研究在2分钟预告片。 资源 有关详细信息...
  • 命令中心以静态,动态方式调查和分析二进制文件,以防止缓冲区溢出。 用法:python3 BinMaster.py 语 文件名 MD5哈希 描述 版本 python3 BinMaster.py 5c2b7386b14aa687a8a2af351526a3be 指挥中心 全栈 一个...
  • 在精确定位控制系统中,为了提高控制精度,准确测量控制对象的位置是十分重要的。...其是采用光电轴角编码器进行精确位置控制。光电轴角编码器根据其刻度方法及信号输出形式,可分为增量式、绝对式以及混...
  • python八进制转二进制Python is known for being powerful and easy to use when it comes to math. Both its native capabilities and resourceful libraries like NumPy, Pandas, or Scikit-learn, provide ...
  • Linux rpm(二进制包)

    2019-09-25 17:59:28
    Linux 常见软件包分为两种,分别是源代码包(Source Code)、二进制包(Binary Code),源代码包是没有经过编译的包,需要经过 GCC、C++编译器环境编译或解压才能运行,二进制包无需编译,可以直接安装使用。...
  • 找出二进制中的0Welcome to my guide on dynamic binary instrumentation (DBI). In this article, we’re going to learn the evolution of general binary analysis methods and how to perform some common ...
  • 这是某些功能的Ghidra / Java实现,尤其是函数哈希和恶意软件分析工具,但随着时间的推移,有望增加新的工具和功能。 由于这是一项新工作,因此该实现与基于ROSE的原始C ++实现尚不具有完全的功能奇偶性; 但是,...
  • Linux rpm (二进制包)

    2019-09-25 11:28:31
    Linux 常见软件包分为两种,分别是源代码包(Source Code)、二进制包(Binary Code),源代码包是没有经过编译的包,需要经过 GCC、C++编译器环境编译或解压才能运行,二进制包无需编译,可以直接安装使用。...
  • 初识二进制文件

    2020-03-25 19:01:17
    计算机文件 一般分为两类:二进制文件 和 ASCII文件(也称纯文本文件)。 ASCII文件:用纯文本编辑器能够打开且打开文件的内容是人类能够理解的可显示字符。 二进制文件:狭义的说,除去纯文本文件以外的文件均为...
  • 摘要 低功耗、单一用途的嵌入式设备(例如路由器...这种多二进制服务实现使当前的静态和动态分析技术无效或低效,因为它们无法识别各种可执行文件之间的通信并对其进行充分建模。在本文中,我们介绍了 KARONTE,这是一
  • 本篇文章开始新的篇章,学习应用程序的二进制接口-ABI。 文章目录1 什么是ABI(Application Binary Interface)1 ABI的广义与侠义概念2 什么是EABI(Embedded Application Binary Interface)3 ABI规范示例...
  • 因此,二进制代码分析被用于许多原因,包括软件取证,恶意软件分析,性能分析和调试。文献中有很多二进制代码分析方法,其中最常用的有符号执行、concolic执行、静态污染分析和动态污染分析为了验证我根据之前一篇...
  • 软件工程中的逆向工程(reverse engineering)就是根据已经存在应用程序,反向推出软件设计时的数据和理念的过程,其最终目的是使软件...从二进制代码中恢复出高级语言层次的数据抽象和数据类型一直是逆向工程中的难题。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,740
精华内容 6,696
关键字:

二进制软件分析binary