精华内容
下载资源
问答
  • 1.二进制,十进制,十六进制和ASCII码二进制转十进制(相加法):2+2²+...+2的n次方相加转换十进制;例如:十进制转换成二进制(拆分法):使用把十进制拆分成二进制的n次方相加即可;例如:二进制转十六进制(相加法):2...

    1.二进制,十进制,十六进制和ASCII码

    二进制转十进制(相加法):2+2²+...+2的n次方相加转换成十进制;例如:

    4134382c8200

    十进制转换成二进制(拆分法):使用把十进制拆分成二进制的n次方相加即可;例如:

    4134382c8200

    二进制转十六进制(相加法):2+2²+...+2的n次方相加转换成十六进制;例如:

    4134382c8200

    十六进制转换成二进制(拆分法):使用把十六进制拆分成二进制的n次方相加即可;例如:

    4134382c8200

    二进制对应ASCII:

    2.二进制逻辑与,逻辑或,逻辑非的运算

    逻辑与:1010&&1100   两边都为真时候为真

    1 0 1 0

    1 1 0 0

    结果 1 0 0 0

    逻辑或:1010||1100一边为真是就为真

    1 0 1 0

    1 1 0 0

    结果 1 1 1 0

    实际用例子:

    角色有董事长李先生拥有权限A B C,总经理王先生拥有的权限是A B

    权限有A权限  对应的二进制存储1010

    权限有B权限  对应的二进制存储1100

    权限有C权限  对应的二进制存储0011

    董事长李先生拥有的权限是:A B C的二进制进行逻辑与运算

    1 0 1 0

    1 1 0 0

    0 0 1 1

    结果 1 0 1 0

    总经理王先生拥有的权限是:A B 的二进制进行逻辑与运算

    1 0 1 0

    1 1 0 0

    结果 1 0 0 0

    3.二进制的位移运算

    例子:1100     十进制12

    左移一位:11000   十进制24

    右移一位:0110   十进制6

    规则:位移运算左一一位乘以二,右移一位除以二;

    展开全文
  • 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二进制文件分析

    展开全文
  • Learning Linux Binary Analysis linux 二进制分析 二进制分析
  • 这个是 《linux二进制分析》的随书源码, 并且增加了第二章的源码,国内不好找的。另外还有该书的勘误,有需要的可以下载看看。
  • BinExp:Linux二进制开发
  • Linux 二进制分析

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

    内容简介

    二进制分析属于信息安全业界逆向工程中的一种技术,通过利用可执行的机器代码(二进制)来分析应用程序的控制结构和运行方式,有助于信息安全从业人员更好地分析各种漏洞、病毒以及恶意软件,从而找到相应的解决方案。本书将带领读者探索连一些专家都未曾接触的领域,正式进入计算机黑客世界。

    本书是一本剖析 Linux ELF 工作机制的图书,共分为9章,其内容涵盖了 Linux 环境和相关工具、ELF 二进制格式、Linux 进程追踪、ELF 病毒技术、Linux 二进制保护、Linux 中的 ELF 二进制取证分析、进程内存取证分析、扩展核心文件快照技术、Linux/proc/kcore 分析等。

    如果你是一名软件工程师或者逆向工程师,想要学习 Linux 二进制分析相关的内容,本书实为明智之选。本书提供了在安全、取证和杀毒领域中实施二进制分析的解决方案。本书也适合安全爱好者和系统工程师阅读。为了更好地理解本书内容,读者需要具备一定的 C 语言编程基础和 Linux 命令行知识

    作者简介

    Ryan O'Neill(ELF 大师)是一名计算机安全研究员兼软件工程师,具有逆向工程、软件开发、安全防御和取证分析技术方面的背景。他是在计算机黑客亚文化的世界中成长起来的——那个由 EFnet、BBS 系统以及系统可执行栈上的远程缓冲区溢出组成的世界。他在年轻时接触了系统安全、开发和病毒编写等领域。他对计算机黑客的极大热情如今已经演变成了对软件开发和专业安全研究的热爱。Ryan 在 DEFCON 和 RuxCon 等很多计算机安全会议上发表过演讲,还举办了一个为期两天的 ELF 二进制黑客研讨会。

    他的职业生涯非常成功,曾任职于 Pikewerks、Leviathan 安全集团这样的大公司,近在 Backtrace 担任软件工程师。

    Ryan 还未出版过其他图书,不过他在 Phrack 和 VXHeaven 这样的在线期刊上发表的论文让他声名远扬。还有许多其他的作品可以从他的网站上找到。

    本书内容

    译者序

    译者棣琦(本名张萌萌),曾梦想成为一名高级口译,却阴差阳错成了一个爱写代码的程序员。在 IT 江湖升级打怪的过程中,为了不断提高自己的技能,看书是少不了的;而要想成为高级玩家,看英文书自然也是必须。一个很偶然的机会,我接触到了本书的英文版。第一遍翻看时略显吃力,毕竟书中讲述的许多概念都是作者的原创,网上几无相关资料。但是这些稀缺的内容对于深入理解二进制分析却非常重要,译者由此尝到了知识的甜头。本着“独乐乐不如众乐乐”和“知识分享”的目的,本书的翻译之路就这样顺理成章地开始了。

    要想成为一名真正的黑客,不仅要会编写程序,还需要解析程序,对已有的二进制文件进行反编译,洞悉程序的工作原理。而本书完全是作者多年来在逆向工程领域的实战经验总结,其内容从 Linux 二进制格式的简单介绍到二进制逆向的细节,不一而足。书中还穿插了作者自己维护的许多项目或软件代码示例。相信通过本书的学习,读者完全可以掌握 Linux 二进制分析相关的一套完整的知识体系,为成长为一名高水平的黑客打下坚实的基础。考虑到本书并非针对零基础的读者编写,因此建议读者能够有一定的 C 语言和 Linux 基础,以便更好地理解领会书中精华。另外,任何 IT 技术的学习掌握,都离不开动手操作。读者要想叩开 Linux 二进制世界的大门,需要亲自动手实践书中示例,才能将书本知识转换为自身技能。

    最后,不能免俗的是各种致谢(虽然俗,但诚意百分百)。感谢我的父母对我闯荡江湖的支持,感谢 Linux 中国创始人王兴宇的信赖,感谢语音识别领域的技术大牛姚光超提出的宝贵建议,感谢我的朋友 Ray 对我的鼓励。当然,更要感谢各位读者的支持。

    最后的最后,由于译者水平有限,外加本书作者在表达上多有晦涩之处,因此译文难免有纰漏,还望广大读者以及业内同行批评指正。

    2017年9月

    北京

    关于作者

    Ryan O'Neill 是一名计算机安全研究员兼软件工程师,具有逆向工程、软件开发、安全防御和取证分析技术方面的背景。他是在计算机黑客亚文化的世界中成长起来的——那个由 EFnet、BBS 系统以及系统可执行栈上的远程缓冲区溢出组成的世界。他在年轻时就接触了系统安全、开发和病毒编写等领域。他对计算机黑客的极大热情如今已经演变成了对软件开发和专业安全研究的热爱。Ryan 在 DEFCON 和 RuxCon 等很多计算机安全会议上发表过演讲,还举办了一个为期两天的 ELF 二进制黑客研讨会。

    他的职业生涯非常成功,曾就职于 Pikewerks、Leviathan 安全集团这样的大公司,最近在 Backtrace 担任软件工程师。

    Ryan 还未出版过其他图书,不过他在 PhrackVXHeaven 这样的在线期刊上发表的论文让他声名远扬。还有许多其他的作品可以从他的网站(http://www.bitlackeys.org)上找到。

    致谢

    首先,要向我的母亲 Michelle 致以真诚的感谢,我已经将对她的感谢表达在这本书里了。这一切都是从母亲为我买的第一台计算机开始的,随后是大量的图书,从 UNIX 编程,到内核内部原理,再到网络安全。在我生命中的某一刻,我以为会永远放弃计算机,但是大约过了5年之后,当我想要重新点燃激情时,却发现已经把书扔掉了。随后我发现母亲偷偷地把那些书帮我保存了起来,一直到我重新需要的那一天。感谢我的母亲,你是最美的,我爱你。

    还要感谢我生命中最重要的一个女人,她是我的另一半,是我的孩子的母亲。毫无疑问,如果没有她,就不会有我今天生活和事业上的成就。人们常说,每一个成功男人的背后都有一个伟大的女人。这句古老的格言道出的的确是真理。感谢 Marilyn 给我带来了极大的喜悦,并进入了我的生活。我爱你。

    我的父亲 Brian O'Neill 在我生活中给了我巨大的鼓舞,教会了我为人夫、为人父和为人友的许多东西。我爱我的父亲,我会一直珍惜我们之间哲学和精神层面的交流。

    感谢 Michael 和 Jade,感谢你们如此独特和美好的灵魂。我爱你们。

    最后,要感谢我的3个孩子:Mick、Jayden 和 Jolene。也许有一天你们会读到这本书,知道你们的父亲对计算机略知一二。我会永远把你们放在生活的首位。你们3个是令我惊奇的存在,为我的生活带来了更深刻的意义和爱。

    Silvio Cesare 在计算机安全领域是一个传奇的名字,因为他在许多领域都有高度创新和突破性的研究,从 ELF 病毒,到内核漏洞分析方面的突破。非常感谢 Silvio 的指导和友谊。我从你那里学到的东西要远远多于从我们行业其他人处所学的东西。

    Baron Oldenburg 也对本书起了很大的推动作用。好多次由于时间和精力的原因我几乎要放弃了,幸好 Baron 帮我进行了初始的编辑和排版工作。这为本书的编写减轻了很大的负担,并最终促使本书问世。谢谢 Baron!你是我真正的朋友。

    Lorne Schell 是一位真正的文艺复兴式的人物——软件工程师、音乐家、艺术家。本书的封面就是出自他的聪慧之手。Vitruvian(维特鲁威风格的)Elf 与本书的描述艺术性的重合是多么令人惊喜!非常感谢你的才华,以及为此付出的时间和精力。

    Chad Thunberg 是我在 Leviathan 安全集团工作时的老板,他为我编写本书提供了所需要的资源和支持。非常感谢!

    感谢 Efnet 网站所有在#bitlackeys上的朋友的友谊和支持!

    关于审稿人

    Lubomir Rintel 是一名系统程序员,生活在捷克的布尔诺市。他是一位全职的软件开发人员,目前致力于 Linux 网络工具的开发。除此之外,他还对许多项目做出过贡献,包括 Linux 内核和 Fedora 发行版。活跃在开源软件社区多年之后,他懂得一本好书涵盖的主题要比参考手册更加广泛。他相信本书就是这样,希望你也能够像他一样喜欢这本书。另外,他还喜欢食蚁兽。

    截至2015年11月,Kumar Sumeet 在 IT 安全方面已经有4年多的研究经验了,在此期间,他开创了黑客和间谍工具的前沿。他拥有伦敦大学皇家霍洛威分校的信息安全硕士学位,最近的重点研究领域是检测网络异常和抵御威胁的机器学习技术。

    Sumeet 目前是 Riversafe 公司的一名安全顾问。Riversafe 是伦敦的一家网络安全和 IT 数据管理咨询公司,专注于一些尖端的安全技术。该公司也是2015年在 EMEA 地区的 Splunk Professional Services 的合作伙伴。他们已经完成了涉及许多领域(包括电信、银行和金融市场、能源和航空局)的大型项目。

    Sumeet 也是 Penetration Testing Using Raspberry Pi(Packt Publishing 出版)一书的技术审稿人。

    enter image description here

    有关他的项目和研究的更多详细信息,可以访问他的网站https://krsumeet.com,或者扫描右侧的二维码。

    你也可以通过电子邮件contact@krsumeet.com联系他。

    Heron Yang 一直致力于创造人们真正想要的东西。他在高中时就建立了这样坚定的信仰。随后他在台湾交通大学和卡内基梅隆大学专注于计算机科学的研究。在过去几年,他专注于在人和满足用户需求之间建立联系,致力于开发初创企业创意原型、新应用或者网站、学习笔记、出书、写博客等。


    感谢 Packt 给我这个机会参与本书的创作过程,并感谢 Judie Jose 在本书的创作过程中给我的很多帮助。此外,感谢我经历过的所有挑战,这让我成为一个更好的人。本书深入二进制逆向的诸多细节,对于那些关心底层机制的人来说会是很好的资料。大家可通过heron.yang.tw@gmail.com或者http://heron.me跟我打招呼或讨论图书内容。

    前言

    软件工程是创建能够在微处理器上存在、运行和发挥作用的造物行为。我们称这种造物为程序。逆向工程是发现程序如何运行和发挥作用的行为,进一步讲,就是使用反编译器和逆向工具进行组合,并依靠我们的专业技能来控制要进行反编译的目标程序,来理解、解析或者修改程序的行为。我们需要理解二进制格式、内存布局和给定处理器的指令集的复杂性,才能控制微处理器上某个程序的生命周期。逆向工程师是掌握了二进制领域相关知识的技术人员。本书将教会你成为一名 Linux 二进制黑客所需要的合理的课程、洞察力和相关任务。当一个人自称逆向工程师的时候,他自己其实已经超出了工程师的水平。一个真正的黑客不仅可以编写代码,还可以解析代码,反编译二进制文件和内存段,他追求的是修改软件程序的内部工作原理。这就是反编译工程师的动力。

    从专业或者兴趣爱好的角度来看,我都会在计算机安全领域(无论是漏洞分析、恶意软件分析、防病毒软件、rootkit 检测,还是病毒设计)使用自己在逆向工程方面的技能。本书的大部分内容专注于计算机安全方面。我们会分析内存转储、进程镜像重建,并对二进制分析更深奥的领域进行探索,包括 Linux 病毒感染和二进制取证分析。我们将会解析被恶意软件感染的二进制文件,还会感染运行中的进程。本书旨在解释 Linux 逆向工程所必需的组件,因此我们会深入学习 ELF(可执行文件和链接格式)。ELF 是 Linux 中可执行文件、共享库、核心转储文件和目标文件的二进制格式。本书最重要的一个方面是针对 ELF 二进制格式的结构复杂性给出了深入的分析。ELF 节、段、动态链接等这些概念都是非常重要的,也是逆向工程方面相关知识的比较有意思的分支。我们将会深入探索 ELF 二进制攻击,并了解如何将这些技能应用到更广泛的工作中。

    本书的目标是让读者成为对 Linux 二进制攻防有扎实基础的少数人之一,这将会为打开创新性研究的大门提供一个非常广泛的主题,并将读者带领到 Linux 操作系统高级黑客技术的前沿。你将掌握 Linux 二进制修补、病毒工程化/分析、内核取证分析和 ELF 二进制格式这一套宝贵的知识体系。读者也会对程序执行和动态链接有更深入的了解,对二进制保护和调试的内部原理有更深入的理解。

    我是一名计算机安全研究员、软件工程师,也是一名黑客。本书只是有组织地对我所做过的研究进行了文档性描述,也是对已经做出研究结果的一些基础知识的描述。

    本书所涵盖的很多知识都无法在互联网上找到。本书试图将一些相关联的主题集中在一起,以便作为 Linux 二进制和内存攻击这一主题的入门手册和参考。虽然不是非常完善,不过也涵盖了入门需要的很多核心信息。

    本书涵盖的内容

    第1章,Linux 环境和相关工具,简要介绍了 Linux 环境和相关的工具,在整本书中都会用到。

    第2章,ELF 二进制格式,帮助读者了解 ELF 二进制格式每个主要的组件,在 Linux 和大多数类 UNIX 系统上都会用到。

    第3章,Linux 进程追踪,教会读者使用 ptrace 系统调用读写进程内存并注入代码。

    第4章,ELF 病毒技术——Linux/UNIX 病毒,将会介绍 Linux 病毒的过去、现在和将来,以及病毒的工程化和围绕病毒进行的相关研究。

    第5章,Linux 二进制保护,解释 ELF 二进制保护的基本原理。

    第6章,Linux 下的 ELF 二进制取证分析,通过解析 ELF 目标文件来研究病毒、后门和可疑的代码注入。

    第7章,进程内存取证分析,将会介绍如何解析进程的地址空间,以研究内存中的恶意软件、后门和可疑的代码注入。

    第8章,ECFS——扩展核心文件快照技术,是对 ECFS 这一用于深入进程内存取证分析的新开源产品的介绍。

    第9章,Linux/proc/kcore 分析,介绍了如何使用/proc/kcore 进行内存分析来检测 Linux 内核中的恶意软件。

    阅读本书的先决条件

    阅读本书的先决条件如下:假定读者具有 Linux 命令行相关的操作知识,对 C 语言编程技巧有一定的理解,对 x86 汇编语言知识有基本的掌握(不是必需,但会有很大的帮助)。有句话说得好:“如果你可以读懂汇编语言,那么一切都是开源的”。

    本书读者对象

    如果你是一名软件工程师或者逆向工程师,想学习 Linux 二进制分析相关的更多知识,本书将会为你提供在安全、取证分析和防病毒领域进行二进制分析所需要用到的一切知识。假如你是一位安全技术领域的爱好者或者是一名系统工程师,并且有 C 语言编程和 Linux 命令行相关的经验,这本书将非常适合你。

    第1章 Linux 环境和相关工具

    本章将集中介绍 Linux 环境,因为这将贯穿整本书的始终。本书的重点是对 Linux 二进制进行分析,那么利用好 Linux 自带的一些通用的本地环境工具将会对 Linux 二进制分析非常有帮助。Linux 自带了应用普遍的 binutils 工具,该工具也可以在网站http://www.gnu.org/software/binutils/中找到,里面包含了一些用于二进制分析和破解的工具。本书不会介绍二进制逆向工程的通用软件 IDA Pro,但还是鼓励读者使用它。不过,在本书中不会使用 IDA。然而,通过本书的学习,你可以利用现有的环境对任何 Linux 系统进行二进制破解。由此,便可以欣赏到作为一个真正的黑客可以利用许多免费工具的 Linux 环境之美。在本书中,我们将会展示各种工具的使用,随着每个章节的推进,也会不断回顾这些工具的使用方法。现在我们将本章作为参考章节,介绍 Linux 环境下的相关工具和技巧。如果你已经非常熟悉 Linux 环境以及反编译、调试、转换 ELF 文件的工具,可以跳过本章。

    1.1 Linux 工具

    在本书中将用到许多公开发布的免费工具。本节内容将会对其中某些工具进行概要阐述。

    1.1.1 GDB

    GNU 调试器(GDB)不仅可以用来调试有 bug 的应用程序,也可以用来研究甚至改变一个程序的控制流,还可以用来修改代码、寄存器和数据结构。对于一个致力于寻找软件漏洞或者破解一个内部非常复杂的病毒的黑客来讲,这些都是非常常见的工作。GDB 主要用于分析 ELF 二进制文件和 Linux 进程,是 Linux 黑客的必备工具,在本书中我们也会在各种不同的例子中使用到 GDB。

    1.1.2 GNU binutils 中的 objdump

    object dump(objdump)是一种对代码进行快速反编译的简洁方案,在反编译简单的、未被篡改的二进制文件时非常有用,但是要进行任何真正有挑战性的反编译任务,特别是针对恶意软件时,objdump 就显示出了它的局限性。其最主要的一个缺陷就是需要依赖 ELF 节头,并且不会进行控制流分析,这极大地降低了 objdump 的健壮性。如果要反编译的文件没有节头,那么使用 objdump 的后果就是无法正确地反编译二进制文件中的代码,甚至都不能打开二进制文件。不过,对于一些比较平常的任务,如反编译未被加固、精简(stripped)或者以任何方式混淆的普通二进制文件,objdump 已经足够了。objdump 可以读取所有常用的 ELF 类型的文件。下面是关于 objdump 使用方法的一些常见例子。

    • 查看 ELF 文件中所有节的数据或代码:
        objdump –D <elf_object> 
    • 只查看 ELF 文件中的程序代码:
        objdump –d <elf_object> 
    • 查看所有符号:
        objdump –tT <elf_object> 

    在第2章介绍ELF二进制格式时,我们将更加深入地介绍objdump和其他相关工具。

    1.1.3 GNU binutils 中的 objcopy

    object copy(objcopy)是一款非常强大的小工具,很难用一句话对其进行概述。推荐读者参考objcopy的使用手册,里面描述得非常详细。虽然objcopy的某些特征只针对特定的ELF目标文件,但是,它还可以用来分析和修改任意类型的ELF目标文件,还可以修改ELF节,或将ELF节复制到ELF二进制中(或从ELF二进制中复制ELF节)。

    要将.data节从一个ELF目标文件复制到另一个文件中,可以使用下面的命令:

    objcopy –only-section=.data <infile> <outfile> 

    objcopy工具会在本书的后续内容中用到。现在只要记住有这样一个工具,并且知道这是对 Linux 二进制黑客来说非常有用的一个工具就可以了。

    1.1.4 strace

    system call trace(strace,系统调用追踪)是基于ptrace(2)系统调用的一款工具,strace通过在一个循环中使用PTRACE_SYSCALL请求来显示运行中程序的系统调用(也称为 syscalls)活动相关的信息以及程序执行中捕捉到的信号量。strace在调试过程中非常有用,也可以用来收集运行时系统调用相关的信息。

    使用strace命令来跟踪一个基本的程序:

    strace /bin/ls –o ls.out 

    使用strace命令附加到一个现存的进程上:

    strace –p <pid> -o daemon.out 

    原始输出将会显示每个系统调用的文件描述编号,系统调用会将文件描述符作为参数,如下所示:

    SYS_read(3, buf, sizeof(buf)); 

    如果想查看读入到文件描述符3中的所有数据,可以运行下面的命令:

    strace –e read=3 /bin/ls 

    也可以使用–e write=fd命令查看写入的数据。strace是一个非常有用的小工具,会在很多地方用到。

    1.1.5 ltrace

    library traceltrace,库追踪)是另外一个简洁的小工具,与strace非常类似。ltrace 会解析共享库,即一个程序的链接信息,并打印出用到的库函数。

    1.1.6 基本的 ltrace 命令

    除了可以查看库函数调用之外,还可以使用-S标记查看系统调用。ltrace命令通过解析可执行文件的动态段,并打印出共享库和静态库的实际符号和函数,来提供更细粒度的信息:

    ltrace <program> -o program.out 

    1.1.7 ftrace

    function traceftrace,函数追踪)是我自己设计的一个工具。ftrace 的功能与ltrace类似,但还可以显示出二进制文件本身的函数调用。我没有找到现成的实现这个功能的 Linux 工具,于是就决定自己编码实现。这个工具可以在网站https://github.com/elfmaster/ftrace找到。下一章会对这个工具的使用进行介绍。

    1.1.8 readelf

    readelf命令是一个非常有用的解析ELF二进制文件的工具。在进行反编译之前,需要收集目标文件相关的信息,该命令能够提供收集信息所需要的特定于ELF的所有数据。在本书中,我们将会使用readelf命令收集符号、段、节、重定向入口、数据动态链接等相关信息。readelf命令是分析ELF二进制文件的利器。第2章将对该命令进行更深入的介绍,下面是几个常用的标记。

    • 查询节头表:
        readelf –S <object> 
    • 查询程序头表:
        readelf –l <object> 
    • 查询符号表:
        readelf -s <object> 
    • 查询 ELF 文件头数据:
        readelf –e <object> 
    • 查询重定位入口:
        readelf –r <object> 
    • 查询动态段:
        readelf –d <object> 

    1.1.9 ERESI——ELF 反编译系统接口

    ERESI 工程(http://www.eresi-project.org)中包含着许多 Linux 二进制黑客梦寐以求的工具。令人遗憾的是,其中有些工具没有持续更新,有的与64位 Linux 不适配。ERESI 工程支持许多的体系结构,无疑是迄今为止最具创新性的破解 ELF 二进制文件的工具集合。由于我个人不太熟悉 ERESI 工程中工具的用法,并且其中有些不再更新,因此在本书中就不再对该工程进行更深入的探讨了。不过,有两篇 Phrack 的文章能够说明 ERESI 工具的创新和强大的特性:

    • Cerberus ELF interface(http://www.phrack.org/archives/issues/61/8.txt
    • Embedded ELF debugging(http://www.phrack.org/archives/issues/63/9.txt

    1.2 有用的设备和文件

    Linux 有许多文件、设备,还有/proc入口,它们对狂热的黑客还有反编译工程师来说都非常有用。在本书中,我们将会展示其中许多有用的文件。下面介绍本书中常用的一些文件。

    1.2.1 /proc/<pid>/maps

    /proc/<pid>/map文件保存了一个进程镜像的布局,通过展现每个内存映射来实现,展现的内容包括可执行文件、共享库、栈、堆和 VDSO 等。这个文件对于快速解析一个进程的地址空间分布是至关重要的。在本书中会多次用到该文件。

    1.2.2 /proc/kcore

    /proc/kcoreproc文件系统的一项,是 Linux 内核的动态核心文件。也就是说,它是以 ELF 核心文件的形式所展现出来的原生内存转储,GDB 可以使用/proc/kcore来对内核进行调试和分析。第9章会更深入地介绍/proc/kcore。

    1.2.3 /boot/System.map

    这个文件在几乎所有的 Linux 发行版中都有,对内核黑客来说是非常有用的一个文件,包含了整个内核的所有符号。

    1.2.4 /proc/kallsyms

    kallsymsSystem.map类似,区别就是 kallsyms 是内核所属的/proc的一个入口并且可以动态更新。如果安装了新的 LKM(Linux Kernel Module),符号会自动添加到/proc/kallsyms中。/proc/kallsyms包含了内核中绝大部分的符号,如果在CONFIG_KALLSYMS_ALL内核配置中指明,则可以包含内核中全部的符号。

    1.2.5 /proc/iomem

    iomem是一个非常有用的 proc 入口,与/proc/<pid>/maps类似,不过它是跟系统内存相关的。例如,如果想知道内核的 text 段所映射的物理内存位置,可以搜索Kernel字符串,然后就可以查看 code/text段、data段和bss段的相关内容:

      $ grep Kernel /proc/iomem   01000000-016d9b27 : Kernel code   016d9b28-01ceeebf : Kernel data   01df0000-01f26fff : Kernel bss 

    1.2.6 ECFS

    extended core file snapshot(ECFS,扩展核心文件快照)是一项特殊的核心转储技术,专门为进程镜像的高级取证分析所设计。这个软件的代码可以在https://github.com/elfmaster/ecfs看到。第8章将会单独介绍 ECFS 及其使用方法。如果你已经进入到了高级内存取证分析阶段,你会非常想关注这一部分内容。

    1.3 链接器相关环境指针

    动态加载器/链接器以及链接的概念,在程序链接、执行的过程中都是避不开的基本组成部分。在本书中,你还会学到更多相关的概念。在 Linux 中,有许多可以代替动态链接器的方法可供二进制黑客使用。随着本书的深入,你会开始理解链接、重定向和动态加载(程序解释器)的过程。下面是几个很有用处的链接器相关的属性,在本书中将会用到。

    1.3.1 LD_PRELOAD 环境变量

    LD_PRELOAD环境变量可以设置成一个指定库的路径,动态链接时可以比其他库有更高的优先级。这就允许预加载库中的函数和符号能够覆盖掉后续链接的库中的函数和符号。这在本质上允许你通过重定向共享库函数来进行运行时修复。在后续的章节中,这项技术可以用来绕过反调试代码,也可以用作用户级 rootkit。

    1.3.2 LD_SHOW_AUXV 环境变量

    该环境变量能够通知程序加载器来展示程序运行时的辅助向量。辅助向量是放在程序栈(通过内核的 ELF 常规加载方式)上的信息,附带了传递给动态链接器的程序相关的特定信息。第3章将会对此进行进一步验证,不过这些信息对于反编译和调试来说非常有用。例如,要想获取进程镜像 VDSO 页的内存地址(也可以使用maps文件获取,之前介绍过),就需要查询AT_SYSINFO

    下面是一个带有LD_SHOW_AUXV辅助向量的例子:

    $ LD_SHOW_AUXV=1 whoami AT_SYSINFO: 0xb7779414 AT_SYSINFO_EHDR: 0xb7779000 AT_HWCAP: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmovpat pse36 clflush mmx fxsr sse sse2 AT_PAGESZ: 4096 AT_CLKTCK: 100 AT_PHDR:  0x8048034 AT_PHENT: 32 AT_PHNUM: 9 AT_BASE:  0xb777a000 AT_FLAGS: 0x0 AT_ENTRY: 0x8048eb8 AT_UID:  1000 AT_EUID: 1000 AT_GID:  1000 AT_EGID: 1000 AT_SECURE: 0 AT_RANDOM: 0xbfb4ca2b AT_EXECFN: /usr/bin/whoami AT_PLATFORM: i686 elfmaster 

    第2章将会进一步介绍辅助向量。

    1.3.3 链接器脚本

    链接器脚本是我们的一个兴趣点,因为链接器脚本是由链接器解释的,把程序划分成相应的节、内存和符号。默认的链接器脚本可以使用ld–verbose查看。

    ld链接器程序有其自己解释的一套语言,当有文件(如可重定位的目标文件、共享库和头文件)输入时,ld链接器程序会用自己的语言来决定输出文件(如可执行程序)的组织方式。例如,如果输出的是一个 ELF 可执行文件,链接器脚本能够决定该输出文件的布局,以及每个段里面包含哪些节。另外举一个例子:.bss节总是放在data段的末尾,这就是链接器脚本决定的。你可能很好奇,这为什么就成了我们的一个兴趣点呢?一方面,对编译时链接过程有一定深入的了解是很重要的。gcc依赖于链接器和其他程序来完成编译的任务,在某些情况下,能够控制可执行文件的布局相当重要。ld命令语言是一门相当深入的语言,尽管它超出了本书的范围,但是非常值得探究。另一方面,在对可执行文件进行反编译时,普通段地址或者文件的其他部分有时候会被修改,这就表明引入了一个自定义的链接器脚本。gcc通过使用–T标志来指定链接器脚本。第5章会介绍一个使用链接器脚本的例子。

    1.4 总结

    本章仅介绍了 Linux 环境和工具相关的一些基本概念,在后续的每个章节中都会经常用到。二进制分析主要是了解一些可用的工具和资源并进行相关的整合。目前,我们只简要介绍了这部分工具,在接下来的章节中,随着对 Linux 二进制破解这个广阔领域进行更进一步的探索,我们会有机会对每一个工具进行深入介绍。下一章将会对 ELF 二进制格式进行更深入的探索,也会涉及其他一些有趣的概念,如动态链接、重定位、符号和节(section)等。

    第2章 ELF 二进制格式(上)
    第2章 ELF 二进制格式(下)
    第3章 Linux 进程追踪(上)
    第3章 Linux 进程追踪(下)
    第4章 ELF 病毒技术——Linux/UNIX 病毒
    第5章 Linux 二进制保护
    第6章 Linux 下的 ELF 二进制取证分析
    第7章 进程内存取证分析
    第8章 ECFS——扩展核心文件快照技术(上)
    第8章 ECFS——扩展核心文件快照技术(下)
    第9章 Linux/proc/kcore 分析

    阅读全文: http://gitbook.cn/gitchat/geekbook/5ba9eb5b0110e7701d264575

    展开全文
  • C语言十进制转二进制代码实例用C语言实现将十进制转化为二进制,并统计转换后的二进制码中1的个数。#include int binaryNum[16]; //存放转换后得到的二进制码int count=0; //计数十进制整数被2除的次数int oneCount=...

    C语言十进制转二进制代码实例

    用C语言实现将十进制转化为二进制,并统计转换后的二进制码中1的个数。

    #include

    int binaryNum[16]; //存放转换后得到的二进制码

    int count=0; //计数十进制整数被2除的次数

    int oneCount=0; //得到的二进制码中1的个数

    void main(){

    int num;

    printf("输入一个十进制的整数:");

    scanf("%d",&num);

    while( (num/2) != 1 ){ //判断条件为:除以2之后的商不等于1

    binaryNum[count] = num%2; //取余后的数字存入数组

    num /= 2; //num = num/2; 进行下一轮的判断

    count++; //此变量用来指定数组下标

    }

    binaryNum[count+1] = 1; //最后一次除法做完以后,剩下的商一定是1,所以在最后手动添加一个1

    printf("二进制数值为:");

    //倒序打印出数组中的元素

    // sizeof(整形数组)/sizeof(整形单个元素大小) = 数组的元素个数

    for( int i=sizeof(binaryNum)/sizeof(int)-1; i>=0; i-- ){

    if( binaryNum[i] == 1)

    oneCount++; //出现一次1就累加

    printf("%d",binaryNum[i]);

    }

    printf("\n共有%d个1\n",oneCount);

    }

    时间: 2014-06-17

    [程序1]题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 2.程序源代码: 复制代码 代码如下: #include "stdio.h"#include "conio.h"main(){  int i,j,k;  printf("\n");  for(i=1;i<5;i++) /*以下为三重循环*/

    6b5aa0751a6f1e6a9d0b665a02cc1f46.gif

    C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数. 需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib.h;而使用time()函数需要引入ctime头文件. 使用rand()函数获取一个随机数如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 例子

    fopen(打开文件)相关函数 open,fclose表头文件 #include定义函数 FILE * fopen(const char * path,const char * mode);函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态.mode有下列几种形态字符串:r 打开只读文件,该文件必须存在.r+ 打开可读写的文件,该文件必须存在.w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件.w

    每当想找哪个运算符优先级高时,很多时候总是想找的就没有,真让人气愤!现在,终于有个我个人觉得非常全的,分享给大家,欢迎拍砖! C语言运算符优先级 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 -- () 圆括号 (表达式)/函数名(形参表) -- . 成员选择(对象) 对象.成员名 -- -> 成员选择(指针) 对象指针->成员名 -- 2 - 负号运算符 -表达式 右到左 单目运算符 ~ 按位取反运算符 ~表达式 ++ 自增运算符 +

    6b5aa0751a6f1e6a9d0b665a02cc1f46.gif

    C语言中实现"17进制"转"10进制"实例代码 17进制转成10进制,输入是数字跟大写字母.例如输入G.11.FF,分别输出16.18.270 #include #include using namespace std; int main() { string s; int len,factor=17,num; bool sign;//用来标志输入字符串是否非法 while(cin>>s)

    指向结构体类型变量的使用首先让我们定义结构体:struct stu{char name[20];long number;float score[4];} ;再定义指向结构体类型变量的指针变量:struct stu *p1, *p2 ;定义指针变量p 1.p 2,分别指向结构体类型变量.引用形式为:指针变量→成员:[例7-2] 对指向结构体类型变量的正确使用.输入一个结构体类型变量的成员,并输出. 复制代码 代码如下: #include /*使用m a l l o c (

    system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: 复制代码 代码如下: #include #include #include #include int system(const char * cmdstring){    pid_t pid;    int status; if(cmdstring == NULL){

    1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.字符数组与字符串在c语言中,将字符串作为字符数组来处理.(c++中不是)在实际应用

    本文实例讲述了js数组常见操作及数组与字符串相互转化方法.分享给大家供大家参考,具体如下: 数组与字符串的相互转化

    本文实例讲述了Java中char数组(字符数组)与字符串String类型的转换方法.分享给大家供大家参考,具体如下: 在Java语言编程时,使用"口令字段"jPasswordField组件时,如果要获得密码值,就需要使用该组件的getPassword()方法.jPasswordField的getPassword()方法返回一个char类型的数组,我们经常需要将这个数组转换为String类型,以便进行诸如口令匹配或口令赋值等操作.这时,就需要将char类型的数组进行转换.当然也经常会遇到

    本文实例讲述了C#实现char字符数组与字符串相互转换的方法.分享给大家供大家参考,具体如下: 一.字符串转换为字符数组 char[] tempChar = sourceString.ToCharArray(); 二.字符数组转换为字符串 //方法一 string str = string.Join("", tempChar); //方法二 string str = string.Concat(tempChar); //方法三 string str = new

    2016425154607514.jpg?2016325154615

    字符数组倒序 #include void daoxu(char str[]){ int i; char temp; for(i = 0; i < strlen(str) / 2 ; i ++){ temp = str[i]; str[i] = str[strlen(str) - i-1]; str[strlen(str) - i-1] = temp; } } 单词计数    int wordCount(char str[]){ int i; int count = 0

    C语言文件操作中 fgets.fputs 函数详解 先给出api fgets 语法: #include char *fgets( char *str, int num, FILE *stream ); 函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以nu

    把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准 例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa),但是只有两个 (aba and aba)没有连续重复的字符 (在本例中是 a). 从网上资料获得了一些思路,我的代码: function permAlone(str) { var arr=str.split(""); var perarr=[]; var

    2017811141533541.png?2017711141544

    C语言模拟实现atoi函数的实例详解 atoi函数,主要功能是将一个字符串转变为整数,例如将"12345"–>12345.但在实现过程中,我们难免会因为考虑不够全面而漏掉比较重要的几点,今天就总结一下实现atoi函数需要注意的地方. 1.指针为NULL 2.字符串为空字符串 3.空白字符 4.正号与负号问题 5.溢出问题 6.异常字符处理 接下来看代码:(具体几种问题处理都在代码的注释中说明) #define _CRT_SECURE_NO_WARNINGS 1 #include

    API(Application Programming Interface):应用程序编程接口 使用Scanner 获取键盘录入的字符串 next() ; 在遇到空格的时候 会判定为当前的输入结束 空格之后的内容会收不到 nextLine(); 可以避免被空格中断 , 但是在于接收数字一起使用的时候会被干扰 创建字符串对象 public String(String original) ---> 通过字符串创建一个字符串对象 public String(char[] value) -=--> 通

    字符串的特点 1.  其他类型的数据用在字符串类型处理函数中,会自动将其转化成字符串后,在处理 <?php echo substr("abcdefghijklmn",2,4),"
    "; //cdef //使用数字会自动转化为字符串 echo substr(123456,2,4); //3456 ?> 2. 可以将字符串视为数组,当做字符集合来看待 <?php $str="abcdefg"; //下面这两种方法都

    展开全文
  •  10   11 Hex to decimal  12 echo $((0xff))  13 echo $((16#ff))  14 echo 'ff' | awk '{print strtonum("0x"$0)}'  15   16 Decimal to hex  17 echo "255"|awk '{printf("%x\n",$0...
  • 下面小编就为大家带来一篇浅谈Linux 二进制包安装MySQL的一些问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 我们使用二进制通用包安装MySQL,这个类似于windows下的绿色软件,解压后配置即可使用,下载地址: https://edelivery.Oracle.com/EPD/Search/handle_go 2.将二进制mysql安装文件解压到/usr/local下,这里使用软...
  • linux 二进制安装

    千次阅读 2018-09-26 17:18:25
    mysql二进制安装 1.首先下载一个二进制的mysql包。 2.解压mysql包 tar -zxf mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local/src 3.剪切到/usr/local/mysql 并重新命名为mysql mv mysql-5.5.32-linux2.6-x86_64 ...
  • rpcs3-binaries-linux:Linux二进制文件的存储库
  • Linux Shell进制转换

    2016-04-07 19:23:21
    1、linux shell 中把任意进制的数转换为十进制的数  利用(())运算   格式: ((num=base#number)) 举例: $ ((num=13#78)) //定义num为13进制的78 $ echo $num $ 99 // 输出了78的13进制数 shell内置...
  • linux 进制转换

    2020-04-14 14:44:55
    一、16进制转换成10进制 8进制转换10进制 printf "%d\n" 0xA printf "%d\n" 0012 10 10 echo $((16#A)) echo $((8#12)) ...
  • Linux 十六进制编辑二进制文件

    千次阅读 2014-03-10 11:45:49
    如果在window下可以使用UE来编辑一个二进制文件,但对应日常使用linux系统来工作的朋友,编辑二进制
  • Linux shell 进制转换

    2013-08-08 08:32:08
    shell可以在不调用第3方命令,表示不同进制数据。这里总结以下表示方法。shell 脚本默认数值是由10 进制数处理,除非这个数字某种特殊的标记法或前缀开头.... 使用方法: 其它进制转为10进制进制转进制
  • mysql 5.7.16 linux二进制安装

    千次阅读 2015-12-29 23:18:22
    mysql 5.7.9 linux二进制安装mysql 579 linux二进制安装 环境 下载 创建用户mysql01 解压安装 设置用户环境变量 检查系统是否有mysql 创建配置文件 初始化数据库 启动mysql服务 修改临时密码 客户端登录测试 防火墙...
  • Linux二进制应用软件漏洞自动挖掘研究与实现.pdf
  • 我们都知道在linux下是没有itoa函数的,而又不能通过sprintf实现int转二进制字符串的方式,因此手动编写此代码段,希望可以对大家有帮助。
  • Minicore3.0操作系统上的Linux二进制兼容运行环境.pdf
  • Linux二进制漏洞利用——突破系统防御的关键技术.pdf
  • 我的linux系统上有这个二进制文件。。udit@udit-Dabba ~ $ cat file.encSalted__s�bO��<0�F���Jw!���]�:`C�LKȆ�l使用hexdump命令,我看到它的信息如下。。udit@udit-Dabba ~ $ hexdump -C file.enc...
  • Linux二进制分析

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

    千次阅读 2020-05-19 12:09:48
    可以利用file和size来简单直接的查看二进制文件的细节。 1.1 file 命令行工具file可以用于查看几乎任何类型文件的详细信息。如 1.2 size 命令行工具size能够快速地获取ELF节的字节长度。 2 详细信息分析工具 可以...
  • 十进制转换成二进制及掩码生成

    千次阅读 2016-07-17 23:21:15
    十进制转换成二进制 void change (int num) {  unsigned int temp;  unsigned int mask = 1;  int i; for(i = 31; i &gt;= 0;i--) {  temp = ((unsigned int)num &gt;&gt; i) &amp; ...
  • 二进制前面我们写过。16进制的算法和二进制差不多。都是先对进制本身进行取余作为第一位,然后对进制做除法得到的商再对进制取余作为第二位。。循环往复 下面我附上我的代码 #include void to_binary(unsigned ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 377,375
精华内容 150,950
关键字:

linux二进制转成10进制

linux 订阅