反汇编初探(一)

环境

操作系统:MacOS
编译器:LLVM
反编译工具:Disassembler

一.反汇编的意义

对于一个C语言工程师来说,汇编语言几乎是一门必修课,而对于一个黑客来说,反汇编就是敲开各种漏洞的大门了,在这篇文章中,我们会正向逆向全部走一遍,以期能获得反汇编姿势的初级奥义♂

二.编译♂

1.预处理

在C语言的编译中,第一步就是预处理了,我们本着能少写就少写的原则就用《C指针浅谈》一文中的C语言代码来作为我们编译和逆向分析的目标代码来愉快的玩耍。
但是在这之前我们要稍微修改一下代码。

code:

#include "stdio.h"
#include "stdlib.h"

#define MORPHEUS 723
#define SUEHPROM 327

int main(int argc, char* argv[]){

    int a;
    printf("&a = %d    a = %d\n",&a,a);
    a  = MORPHEUS;
    printf("&a = %d    a = %d\n",&a,a);
    printf("%d",&a);

    int *b;
    printf("&b = %d    b = %d\n",&b,b);
    b  =  &a;
    printf("&b = %d    b = %d    *b = %d\n",&b,b,*b);

    int **c;
    printf("&c = %d    c = %d\n",&c,c);
    c  =  &b;
    printf("&c = %d    c = %d    *c = %d    **c = %d\n",&c,c,*c,**c);

    int ***d;
    printf("&d = %d    d = %d\n",&d,d);
    d  =  &c;
    printf("&d = %d    d = %d    *d = %d    **d = %d    ***d = %d\n",&d,d,*d,**d,***d);


    b  =  (int*)malloc(sizeof(int*)*1);
    *b  =  SUEHPROM;
    printf("&b = %d    b = %d    *b = %d\n",&b,b,*b);

    int *const p1 = (int *)malloc(sizeof(int*)*1);
    printf("&p1 = %d    p1 = %d    *p1 = %d\n",&p1,p1,*p1);

    int const *p2;
    printf("&p2 = %    p2 = %d    *p2 = %d\n",&p2,p2,*p2);

    int const *const p3 = (int *)malloc(sizeof(int*)*1);
    printf("&p3 = %     p3 = %d    *p3 = %d\n",&p3,p3,*p3);

    return 0;
}

相比上次,我们增加了两个宏定义。

我们知道对于LLVM编译器来说,编译输出可执行文件的过程可以分为四个阶段:
预处理,汇编,编译,链接。

由预处理来完成汇编前对源代码的文本处理,然后由汇编器把C源码汇编成相应的汇编代码,再由编译部分把汇编程序编译成二进制机器码,最后再把各个机器码程序段链接到一起成为完整的可执行程序。

那么我们先看看预处理阶段编译器做了什么

输入命令

clang -E test_main.cpp -o ./output/test_main.i
cat ./output/test_main.i

这个时候会输出一大段代码,包含了头文件中的各种声明及定义
我们截取源代码部分的预处理结果

int main(int argc, char* argv[]){

    int a;
    printf("&a = %d    a = %d\n",&a,a);
    a = 723;
    printf("&a = %d    a = %d\n",&a,a);
    printf("%d",&a);

    int *b;
    printf("&b = %d    b = %d\n",&b,b);
    b = &a;
    printf("&b = %d    b = %d    *b = %d\n",&b,b,*b);

    int **c;
    printf("&c = %d    c = %d\n",&c,c);
    c = &b;
    printf("&c = %d    c = %d    *c = %d    **c = %d\n",&c,c,*c,**c);

    int ***d;
    printf("&d = %d    d = %d\n",&d,d);
    d = &c;
    printf("&d = %d    d = %d    *d = %d    **d = %d    ***d = %d\n",&d,d,*d,**d,***d);


    b = (int*)malloc(sizeof(int*)*1);
    *b = 327;
    printf("&b = %d    b = %d    *b = %d\n",&b,b,*b);

    int *const p1 = (int *)malloc(sizeof(int*)*1);
    printf("&p1 = %d    p1 = %d    *p1 = %d\n",&p1,p1,*p1);

    int const *p2;
    printf("&p2 = %    p2 = %d    *p2 = %d\n",&p2,p2,*p2);

    int const *const p3 = (int *)malloc(sizeof(int*)*1);
    printf("&p3 = %     p3 = %d    *p3 = %d\n",&p3,p3,*p3);

    return 0;
}

define宏定义的内容被定义定义结果给完全取代掉了
所以在预处理的过程中,程序完成了对源代码中宏定义的替换,以及对引入的头文件的倒入,头文件声明的引入将使编译程序在阶段3中生成的机器编码能在阶段4中被正确的链接,所以当编译程序在link阶段出现error的时候,可以对各种头文件进行检查。检查程序的引用是否正确。

2.汇编

我们对源代码进行汇编
输入命令:

clang -S test_main.cpp -o ./output/test_main.s

得到文件test_main.s,查看test_main.s中的内容

Code:

    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 12
    .globl  _main
    .p2align    4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp0:
    .cfi_def_cfa_offset 16
Ltmp1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp2:
    .cfi_def_cfa_register %rbp
    subq    $128, %rsp
    leaq    L_.str(%rip), %rax
    leaq    -20(%rbp), %rcx
    movl    $0, -4(%rbp)
    movl    %edi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    movl    -20(%rbp), %edx
    movq    %rax, %rdi
    movq    %rcx, %rsi
    movb    $0, %al
    callq   _printf
    leaq    L_.str(%rip), %rdi
    leaq    -20(%rbp), %rsi
    movl    $723, -20(%rbp)         ## imm = 0x2D3
    movl    -20(%rbp), %edx
    movl    %eax, -76(%rbp)         ## 4-byte Spill
    movb    $0, %al
    callq   _printf
    leaq    L_.str.1(%rip), %rdi
    leaq    -20(%rbp), %rsi
    movl    %eax, -80(%rbp)         ## 4-byte Spill
    movb    $0, %al
    callq   _printf
    leaq    L_.str.2(%rip), %rdi
    leaq    -32(%rbp), %rsi
    movq    -32(%rbp), %rdx
    movl    %eax, -84(%rbp)         ## 4-byte Spill
    movb    $0, %al
    callq   _printf
    leaq    L_.str.3(%rip), %rdi
    leaq    -32(%rbp), %rsi
    leaq    -20(%rbp), %rcx
    movq    %rcx, -32(%rbp)
    movq    -32(%rbp), %rdx
    movq    -32(%rbp), %rcx
    movl    (%rcx), %ecx
    movl    %eax, -88(%rbp)         ## 4-byte Spill
    movb    $0, %al
    callq   _printf
    leaq    L_.str.4(%rip), %rdi
    leaq    -40(%rbp), %rsi
    movq    -40(%rbp), %rdx
    movl    %eax, -92(%rbp)         ## 4-byte Spill
    movb    $0, %al
    callq   _printf
    leaq    L_.str.5(%rip), %rdi
    leaq    -40(%rbp), %rsi
    leaq    -32(%rbp), %rdx
    movq    %rdx, -40(%rbp)
    movq    -40(%rbp), %rdx
    movq    -40(%rbp), %r8
    movq    (%r8), %rcx
    movq    -40(%rbp), %r8
    movq    (%r8), %r8
    movl    (%r8), %r8d
    movl    %eax, -96(%rbp)         ## 4-byte Spill
    movb    $0, %al
    callq   _printf
    leaq    L_.str.6(%rip), %rdi
    leaq    -48(%rbp), %rsi
    movq    -48(%rbp), %rdx
    movl    %eax, -100(%rbp)        ## 4-byte Spill
    movb    $0, %al
    callq   _printf
    leaq    L_.str.7(%rip), %rdi
    leaq    -48(%rbp), %rsi
    leaq    -40(%rbp), %rcx
    movq    %rcx, -48(%rbp)
    movq    -48(%rbp), %rdx
    movq    -48(%rbp), %rcx
    movq    (%rcx), %rcx
    movq    -48(%rbp), %r9
    movq    (%r9), %r9
    movq    (%r9), %r8
    movq    -48(%rbp), %r9
    movq    (%r9), %r9
    movq    (%r9), %r9
    movl    (%r9), %r9d
    movl    %eax, -104(%rbp)        ## 4-byte Spill
    movb    $0, %al
    callq   _printf
    movl    $8, %r9d
    movl    %r9d, %edi
    movl    %eax, -108(%rbp)        ## 4-byte Spill
    callq   _malloc
    leaq    L_.str.3(%rip), %rdi
    leaq    -32(%rbp), %rsi
    movq    %rax, -32(%rbp)
    movq    -32(%rbp), %rax
    movl    $327, (%rax)            ## imm = 0x147
    movq    -32(%rbp), %rdx
    movq    -32(%rbp), %rax
    movl    (%rax), %ecx
    movb    $0, %al
    callq   _printf
    movl    $8, %ecx
    movl    %ecx, %edi
    movl    %eax, -112(%rbp)        ## 4-byte Spill
    callq   _malloc
    leaq    L_.str.8(%rip), %rdi
    leaq    -56(%rbp), %rsi
    movq    %rax, -56(%rbp)
    movq    -56(%rbp), %rdx
    movq    -56(%rbp), %rax
    movl    (%rax), %ecx
    movb    $0, %al
    callq   _printf
    leaq    L_.str.9(%rip), %rdi
    leaq    -64(%rbp), %rsi
    movq    -64(%rbp), %rdx
    movq    -64(%rbp), %r8
    movl    (%r8), %ecx
    movl    %eax, -116(%rbp)        ## 4-byte Spill
    movb    $0, %al
    callq   _printf
    movl    $8, %ecx
    movl    %ecx, %edi
    movl    %eax, -120(%rbp)        ## 4-byte Spill
    callq   _malloc
    leaq    L_.str.10(%rip), %rdi
    leaq    -72(%rbp), %rsi
    movq    %rax, -72(%rbp)
    movq    -72(%rbp), %rdx
    movq    -72(%rbp), %rax
    movl    (%rax), %ecx
    movb    $0, %al
    callq   _printf
    xorl    %ecx, %ecx
    movl    %eax, -124(%rbp)        ## 4-byte Spill
    movl    %ecx, %eax
    addq    $128, %rsp
    popq    %rbp
    retq
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
    .asciz  "&a = %d    a = %d\n"

L_.str.1:                               ## @.str.1
    .asciz  "%d"

L_.str.2:                               ## @.str.2
    .asciz  "&b = %d    b = %d\n"

L_.str.3:                               ## @.str.3
    .asciz  "&b = %d    b = %d    *b = %d\n"

L_.str.4:                               ## @.str.4
    .asciz  "&c = %d    c = %d\n"

L_.str.5:                               ## @.str.5
    .asciz  "&c = %d    c = %d    *c = %d    **c = %d\n"

L_.str.6:                               ## @.str.6
    .asciz  "&d = %d    d = %d\n"

L_.str.7:                               ## @.str.7
    .asciz  "&d = %d    d = %d    *d = %d    **d = %d    ***d = %d\n"

L_.str.8:                               ## @.str.8
    .asciz  "&p1 = %d    p1 = %d    *p1 = %d\n"

L_.str.9:                               ## @.str.9
    .asciz  "&p2 = %    p2 = %d    *p2 = %d\n"

L_.str.10:                              ## @.str.10
    .asciz  "&p3 = %     p3 = %d    *p3 = %d\n"


.subsections_via_symbols

3.编译

接下来我们对汇编代码进行编译,生成二进制的.o文件

命令

clang -c test_main.cpp -o ./output/test_main

然后通过.o文件生成最后的可执行文件

命令

clang ./output/test_main.o -o ./output/test_main
./output/test_main

得到程序正常输出的结果

&a = 1363859820    a = 0
&a = 1363859820    a = 723
1363859820&b = 1363859808    b = 0
&b = 1363859808    b = 1363859820    *b = 723
&c = 1363859800    c = 0
&c = 1363859800    c = 1363859808    *c = 1363859820    **c = 723
&d = 1363859792    d = 0
&d = 1363859792    d = 1363859800    *d = 1363859808    **d = 1363859820    ***d = 723
&b = 1363859808    b = -1698692272    *b = 327
&p1 = 1363859784    p1 = -1698683408    *p1 = 0
&p2 = 0x7fff514ad9402 = 474678464    *p2 = 25
&p3 = 0x7fff514ad9383 = -1698683392    *p3 = 0

4.反汇编

输出了汇编结果及可执行程序之后,就要开始今天的核心内容——逆向。

在这里我们使用macOS平台下一款非常好用的反汇编软件Disassembler来进行机器码到汇编代码的转换。

首先我们对没有link过的.o文件反汇编得到:

/*
--------------------------------------------------------------------------------

        File: /test/output/test_main.o
        MachO file
        CPU: intel/x86_64
        64 bits (Little Endian)

--------------------------------------------------------------------------------
*/



        ; Segment
        ; Range: [0x0; 0x3a8[ (936 bytes)
        ; File offset : [544; 1480[ (936 bytes)
        ; Permissions: readable / writable / executable



        ; Section __text
        ; Range: [0x0; 0x214[ (532 bytes)
        ; File offset : [544; 1076[ (532 bytes)
        ; Flags: 0x80000400
        ;   S_REGULAR
        ;   S_ATTR_PURE_INSTRUCTIONS
        ;   S_ATTR_SOME_INSTRUCTIONS



        ; ================ B E G I N N I N G   O F   P R O C E D U R E ================

        ; Variables:
        ;    var_4: -4
        ;    var_8: -8
        ;    var_10: -16
        ;    var_14: -20
        ;    var_20: -32
        ;    var_28: -40
        ;    var_30: -48
        ;    var_38: -56
        ;    var_40: -64
        ;    var_48: -72
        ;    var_4C: -76
        ;    var_50: -80
        ;    var_54: -84
        ;    var_58: -88
        ;    var_5C: -92
        ;    var_60: -96
        ;    var_64: -100
        ;    var_68: -104
        ;    var_6C: -108
        ;    var_70: -112
        ;    var_74: -116
        ;    var_78: -120
        ;    var_7C: -124


                     _main:
0000000000000000         push       rbp
0000000000000001         mov        rbp, rsp
0000000000000004         sub        rsp, 0x80
000000000000000b         lea        rax, qword [0x214]                          ; "&a = %d    a = %d\\n"
0000000000000012         lea        rcx, qword [rbp+var_14]
0000000000000016         mov        dword [rbp+var_4], 0x0
000000000000001d         mov        dword [rbp+var_8], edi
0000000000000020         mov        qword [rbp+var_10], rsi
0000000000000024         mov        edx, dword [rbp+var_14]
0000000000000027         mov        rdi, rax                                    ; argument "format" for method _printf
000000000000002a         mov        rsi, rcx
000000000000002d         mov        al, 0x0
000000000000002f         call       _printf
0000000000000034         lea        rdi, qword [0x214]                          ; "&a = %d    a = %d\\n", argument "format" for method _printf
000000000000003b         lea        rsi, qword [rbp+var_14]
000000000000003f         mov        dword [rbp+var_14], 0x2d3
0000000000000046         mov        edx, dword [rbp+var_14]
0000000000000049         mov        dword [rbp+var_4C], eax
000000000000004c         mov        al, 0x0
000000000000004e         call       _printf
0000000000000053         lea        rdi, qword [0x227]                          ; "%d", argument "format" for method _printf
000000000000005a         lea        rsi, qword [rbp+var_14]
000000000000005e         mov        dword [rbp+var_50], eax
0000000000000061         mov        al, 0x0
0000000000000063         call       _printf
0000000000000068         lea        rdi, qword [0x22a]                          ; "&b = %d    b = %d\\n", argument "format" for method _printf
000000000000006f         lea        rsi, qword [rbp+var_20]
0000000000000073         mov        rdx, qword [rbp+var_20]
0000000000000077         mov        dword [rbp+var_54], eax
000000000000007a         mov        al, 0x0
000000000000007c         call       _printf
0000000000000081         lea        rdi, qword [0x23d]                          ; "&b = %d    b = %d    *b = %d\\n", argument "format" for method _printf
0000000000000088         lea        rsi, qword [rbp+var_20]
000000000000008c         lea        rcx, qword [rbp+var_14]
0000000000000090         mov        qword [rbp+var_20], rcx
0000000000000094         mov        rdx, qword [rbp+var_20]
0000000000000098         mov        rcx, qword [rbp+var_20]
000000000000009c         mov        ecx, dword [rcx]
000000000000009e         mov        dword [rbp+var_58], eax
00000000000000a1         mov        al, 0x0
00000000000000a3         call       _printf
00000000000000a8         lea        rdi, qword [0x25b]                          ; "&c = %d    c = %d\\n", argument "format" for method _printf
00000000000000af         lea        rsi, qword [rbp+var_28]
00000000000000b3         mov        rdx, qword [rbp+var_28]
00000000000000b7         mov        dword [rbp+var_5C], eax
00000000000000ba         mov        al, 0x0
00000000000000bc         call       _printf
00000000000000c1         lea        rdi, qword [0x26e]                          ; "&c = %d    c = %d    *c = %d    **c = %d\\n", argument "format" for method _printf
00000000000000c8         lea        rsi, qword [rbp+var_28]
00000000000000cc         lea        rdx, qword [rbp+var_20]
00000000000000d0         mov        qword [rbp+var_28], rdx
00000000000000d4         mov        rdx, qword [rbp+var_28]
00000000000000d8         mov        r8, qword [rbp+var_28]
00000000000000dc         mov        rcx, qword [r8]
00000000000000df         mov        r8, qword [rbp+var_28]
00000000000000e3         mov        r8, qword [r8]
00000000000000e6         mov        r8d, dword [r8]
00000000000000e9         mov        dword [rbp+var_60], eax
00000000000000ec         mov        al, 0x0
00000000000000ee         call       _printf
00000000000000f3         lea        rdi, qword [0x298]                          ; "&d = %d    d = %d\\n", argument "format" for method _printf
00000000000000fa         lea        rsi, qword [rbp+var_30]
00000000000000fe         mov        rdx, qword [rbp+var_30]
0000000000000102         mov        dword [rbp+var_64], eax
0000000000000105         mov        al, 0x0
0000000000000107         call       _printf
000000000000010c         lea        rdi, qword [0x2ab]                          ; "&d = %d    d = %d    *d = %d    **d = %d    ***d = %d\\n", argument "format" for method _printf
0000000000000113         lea        rsi, qword [rbp+var_30]
0000000000000117         lea        rcx, qword [rbp+var_28]
000000000000011b         mov        qword [rbp+var_30], rcx
000000000000011f         mov        rdx, qword [rbp+var_30]
0000000000000123         mov        rcx, qword [rbp+var_30]
0000000000000127         mov        rcx, qword [rcx]
000000000000012a         mov        r9, qword [rbp+var_30]
000000000000012e         mov        r9, qword [r9]
0000000000000131         mov        r8, qword [r9]
0000000000000134         mov        r9, qword [rbp+var_30]
0000000000000138         mov        r9, qword [r9]
000000000000013b         mov        r9, qword [r9]
000000000000013e         mov        r9d, dword [r9]
0000000000000141         mov        dword [rbp+var_68], eax
0000000000000144         mov        al, 0x0
0000000000000146         call       _printf
000000000000014b         mov        r9d, 0x8
0000000000000151         mov        edi, r9d                                    ; argument "size" for method _malloc
0000000000000154         mov        dword [rbp+var_6C], eax
0000000000000157         call       _malloc
000000000000015c         lea        rdi, qword [0x23d]                          ; "&b = %d    b = %d    *b = %d\\n", argument "format" for method _printf
0000000000000163         lea        rsi, qword [rbp+var_20]
0000000000000167         mov        qword [rbp+var_20], rax
000000000000016b         mov        rax, qword [rbp+var_20]
000000000000016f         mov        dword [rax], 0x147
0000000000000175         mov        rdx, qword [rbp+var_20]
0000000000000179         mov        rax, qword [rbp+var_20]
000000000000017d         mov        ecx, dword [rax]
000000000000017f         mov        al, 0x0
0000000000000181         call       _printf
0000000000000186         mov        ecx, 0x8
000000000000018b         mov        edi, ecx                                    ; argument "size" for method _malloc
000000000000018d         mov        dword [rbp+var_70], eax
0000000000000190         call       _malloc
0000000000000195         lea        rdi, qword [0x2e2]                          ; "&p1 = %d    p1 = %d    *p1 = %d\\n", argument "format" for method _printf
000000000000019c         lea        rsi, qword [rbp+var_38]
00000000000001a0         mov        qword [rbp+var_38], rax
00000000000001a4         mov        rdx, qword [rbp+var_38]
00000000000001a8         mov        rax, qword [rbp+var_38]
00000000000001ac         mov        ecx, dword [rax]
00000000000001ae         mov        al, 0x0
00000000000001b0         call       _printf
00000000000001b5         lea        rdi, qword [0x303]                          ; "&p2 = %    p2 = %d    *p2 = %d\\n", argument "format" for method _printf
00000000000001bc         lea        rsi, qword [rbp+var_40]
00000000000001c0         mov        rdx, qword [rbp+var_40]
00000000000001c4         mov        r8, qword [rbp+var_40]
00000000000001c8         mov        ecx, dword [r8]
00000000000001cb         mov        dword [rbp+var_74], eax
00000000000001ce         mov        al, 0x0
00000000000001d0         call       _printf
00000000000001d5         mov        ecx, 0x8
00000000000001da         mov        edi, ecx                                    ; argument "size" for method _malloc
00000000000001dc         mov        dword [rbp+var_78], eax
00000000000001df         call       _malloc
00000000000001e4         lea        rdi, qword [0x323]                          ; "&p3 = %     p3 = %d    *p3 = %d\\n", argument "format" for method _printf
00000000000001eb         lea        rsi, qword [rbp+var_48]
00000000000001ef         mov        qword [rbp+var_48], rax
00000000000001f3         mov        rdx, qword [rbp+var_48]
00000000000001f7         mov        rax, qword [rbp+var_48]
00000000000001fb         mov        ecx, dword [rax]
00000000000001fd         mov        al, 0x0
00000000000001ff         call       _printf
0000000000000204         xor        ecx, ecx
0000000000000206         mov        dword [rbp+var_7C], eax
0000000000000209         mov        eax, ecx
000000000000020b         add        rsp, 0x80
0000000000000212         pop        rbp
0000000000000213         ret
                        ; endp

接下来我们对link之后的文件反汇编得到:

        ; Section __text
        ; Range: [0x100000c40; 0x100000e54[ (532 bytes)
        ; File offset : [3136; 3668[ (532 bytes)
        ; Flags: 0x80000400
        ;   S_REGULAR
        ;   S_ATTR_PURE_INSTRUCTIONS
        ;   S_ATTR_SOME_INSTRUCTIONS



        ; ================ B E G I N N I N G   O F   P R O C E D U R E ================

        ; Variables:
        ;    var_4: -4
        ;    var_8: -8
        ;    var_10: -16
        ;    var_14: -20
        ;    var_20: -32
        ;    var_28: -40
        ;    var_30: -48
        ;    var_38: -56
        ;    var_40: -64
        ;    var_48: -72
        ;    var_4C: -76
        ;    var_50: -80
        ;    var_54: -84
        ;    var_58: -88
        ;    var_5C: -92
        ;    var_60: -96
        ;    var_64: -100
        ;    var_68: -104
        ;    var_6C: -108
        ;    var_70: -112
        ;    var_74: -116
        ;    var_78: -120
        ;    var_7C: -124


                     _main:
0000000100000c40         push       rbp
0000000100000c41         mov        rbp, rsp
0000000100000c44         sub        rsp, 0x80
0000000100000c4b         lea        rax, qword [0x100000e84]                    ; "&a = %d    a = %d\\n"
0000000100000c52         lea        rcx, qword [rbp+var_14]
0000000100000c56         mov        dword [rbp+var_4], 0x0
0000000100000c5d         mov        dword [rbp+var_8], edi
0000000100000c60         mov        qword [rbp+var_10], rsi
0000000100000c64         mov        edx, dword [rbp+var_14]
0000000100000c67         mov        rdi, rax                                    ; argument "format" for method imp___stubs__printf
0000000100000c6a         mov        rsi, rcx
0000000100000c6d         mov        al, 0x0
0000000100000c6f         call       imp___stubs__printf
0000000100000c74         lea        rdi, qword [0x100000e84]                    ; "&a = %d    a = %d\\n", argument "format" for method imp___stubs__printf
0000000100000c7b         lea        rsi, qword [rbp+var_14]
0000000100000c7f         mov        dword [rbp+var_14], 0x2d3
0000000100000c86         mov        edx, dword [rbp+var_14]
0000000100000c89         mov        dword [rbp+var_4C], eax
0000000100000c8c         mov        al, 0x0
0000000100000c8e         call       imp___stubs__printf
0000000100000c93         lea        rdi, qword [0x100000e97]                    ; "%d", argument "format" for method imp___stubs__printf
0000000100000c9a         lea        rsi, qword [rbp+var_14]
0000000100000c9e         mov        dword [rbp+var_50], eax
0000000100000ca1         mov        al, 0x0
0000000100000ca3         call       imp___stubs__printf
0000000100000ca8         lea        rdi, qword [0x100000e9a]                    ; "&b = %d    b = %d\\n", argument "format" for method imp___stubs__printf
0000000100000caf         lea        rsi, qword [rbp+var_20]
0000000100000cb3         mov        rdx, qword [rbp+var_20]
0000000100000cb7         mov        dword [rbp+var_54], eax
0000000100000cba         mov        al, 0x0
0000000100000cbc         call       imp___stubs__printf
0000000100000cc1         lea        rdi, qword [0x100000ead]                    ; "&b = %d    b = %d    *b = %d\\n", argument "format" for method imp___stubs__printf
0000000100000cc8         lea        rsi, qword [rbp+var_20]
0000000100000ccc         lea        rcx, qword [rbp+var_14]
0000000100000cd0         mov        qword [rbp+var_20], rcx
0000000100000cd4         mov        rdx, qword [rbp+var_20]
0000000100000cd8         mov        rcx, qword [rbp+var_20]
0000000100000cdc         mov        ecx, dword [rcx]
0000000100000cde         mov        dword [rbp+var_58], eax
0000000100000ce1         mov        al, 0x0
0000000100000ce3         call       imp___stubs__printf
0000000100000ce8         lea        rdi, qword [0x100000ecb]                    ; "&c = %d    c = %d\\n", argument "format" for method imp___stubs__printf
0000000100000cef         lea        rsi, qword [rbp+var_28]
0000000100000cf3         mov        rdx, qword [rbp+var_28]
0000000100000cf7         mov        dword [rbp+var_5C], eax
0000000100000cfa         mov        al, 0x0
0000000100000cfc         call       imp___stubs__printf
0000000100000d01         lea        rdi, qword [0x100000ede]                    ; "&c = %d    c = %d    *c = %d    **c = %d\\n", argument "format" for method imp___stubs__printf
0000000100000d08         lea        rsi, qword [rbp+var_28]
0000000100000d0c         lea        rdx, qword [rbp+var_20]
0000000100000d10         mov        qword [rbp+var_28], rdx
0000000100000d14         mov        rdx, qword [rbp+var_28]
0000000100000d18         mov        r8, qword [rbp+var_28]
0000000100000d1c         mov        rcx, qword [r8]
0000000100000d1f         mov        r8, qword [rbp+var_28]
0000000100000d23         mov        r8, qword [r8]
0000000100000d26         mov        r8d, dword [r8]
0000000100000d29         mov        dword [rbp+var_60], eax
0000000100000d2c         mov        al, 0x0
0000000100000d2e         call       imp___stubs__printf
0000000100000d33         lea        rdi, qword [0x100000f08]                    ; "&d = %d    d = %d\\n", argument "format" for method imp___stubs__printf
0000000100000d3a         lea        rsi, qword [rbp+var_30]
0000000100000d3e         mov        rdx, qword [rbp+var_30]
0000000100000d42         mov        dword [rbp+var_64], eax
0000000100000d45         mov        al, 0x0
0000000100000d47         call       imp___stubs__printf
0000000100000d4c         lea        rdi, qword [0x100000f1b]                    ; "&d = %d    d = %d    *d = %d    **d = %d    ***d = %d\\n", argument "format" for method imp___stubs__printf
0000000100000d53         lea        rsi, qword [rbp+var_30]
0000000100000d57         lea        rcx, qword [rbp+var_28]
0000000100000d5b         mov        qword [rbp+var_30], rcx
0000000100000d5f         mov        rdx, qword [rbp+var_30]
0000000100000d63         mov        rcx, qword [rbp+var_30]
0000000100000d67         mov        rcx, qword [rcx]
0000000100000d6a         mov        r9, qword [rbp+var_30]
0000000100000d6e         mov        r9, qword [r9]
0000000100000d71         mov        r8, qword [r9]
0000000100000d74         mov        r9, qword [rbp+var_30]
0000000100000d78         mov        r9, qword [r9]
0000000100000d7b         mov        r9, qword [r9]
0000000100000d7e         mov        r9d, dword [r9]
0000000100000d81         mov        dword [rbp+var_68], eax
0000000100000d84         mov        al, 0x0
0000000100000d86         call       imp___stubs__printf
0000000100000d8b         mov        r9d, 0x8
0000000100000d91         mov        edi, r9d                                    ; argument "size" for method imp___stubs__malloc
0000000100000d94         mov        dword [rbp+var_6C], eax
0000000100000d97         call       imp___stubs__malloc
0000000100000d9c         lea        rdi, qword [0x100000ead]                    ; "&b = %d    b = %d    *b = %d\\n", argument "format" for method imp___stubs__printf
0000000100000da3         lea        rsi, qword [rbp+var_20]
0000000100000da7         mov        qword [rbp+var_20], rax
0000000100000dab         mov        rax, qword [rbp+var_20]
0000000100000daf         mov        dword [rax], 0x147
0000000100000db5         mov        rdx, qword [rbp+var_20]
0000000100000db9         mov        rax, qword [rbp+var_20]
0000000100000dbd         mov        ecx, dword [rax]
0000000100000dbf         mov        al, 0x0
0000000100000dc1         call       imp___stubs__printf
0000000100000dc6         mov        ecx, 0x8
0000000100000dcb         mov        edi, ecx                                    ; argument "size" for method imp___stubs__malloc
0000000100000dcd         mov        dword [rbp+var_70], eax
0000000100000dd0         call       imp___stubs__malloc
0000000100000dd5         lea        rdi, qword [0x100000f52]                    ; "&p1 = %d    p1 = %d    *p1 = %d\\n", argument "format" for method imp___stubs__printf
0000000100000ddc         lea        rsi, qword [rbp+var_38]
0000000100000de0         mov        qword [rbp+var_38], rax
0000000100000de4         mov        rdx, qword [rbp+var_38]
0000000100000de8         mov        rax, qword [rbp+var_38]
0000000100000dec         mov        ecx, dword [rax]
0000000100000dee         mov        al, 0x0
0000000100000df0         call       imp___stubs__printf
0000000100000df5         lea        rdi, qword [0x100000f73]                    ; "&p2 = %    p2 = %d    *p2 = %d\\n", argument "format" for method imp___stubs__printf
0000000100000dfc         lea        rsi, qword [rbp+var_40]
0000000100000e00         mov        rdx, qword [rbp+var_40]
0000000100000e04         mov        r8, qword [rbp+var_40]
0000000100000e08         mov        ecx, dword [r8]
0000000100000e0b         mov        dword [rbp+var_74], eax
0000000100000e0e         mov        al, 0x0
0000000100000e10         call       imp___stubs__printf
0000000100000e15         mov        ecx, 0x8
0000000100000e1a         mov        edi, ecx                                    ; argument "size" for method imp___stubs__malloc
0000000100000e1c         mov        dword [rbp+var_78], eax
0000000100000e1f         call       imp___stubs__malloc
0000000100000e24         lea        rdi, qword [0x100000f93]                    ; "&p3 = %     p3 = %d    *p3 = %d\\n", argument "format" for method imp___stubs__printf
0000000100000e2b         lea        rsi, qword [rbp+var_48]
0000000100000e2f         mov        qword [rbp+var_48], rax
0000000100000e33         mov        rdx, qword [rbp+var_48]
0000000100000e37         mov        rax, qword [rbp+var_48]
0000000100000e3b         mov        ecx, dword [rax]
0000000100000e3d         mov        al, 0x0
0000000100000e3f         call       imp___stubs__printf
0000000100000e44         xor        ecx, ecx
0000000100000e46         mov        dword [rbp+var_7C], eax
0000000100000e49         mov        eax, ecx
0000000100000e4b         add        rsp, 0x80
0000000100000e52         pop        rbp
0000000100000e53         ret
                        ; endp

因为只是简单的一个文件的编译,所以并不会生成多个.o文件等待链接,所以实际上这两份反汇编代码的代码段是一样的,区别只是在文件的头部格式里。

4.代码分析

现在我们来对反汇编之后的代码进行分析。(需要一定的堆,栈,80x86汇编及程序段知识)

144787-3627fd1acac439b2.png
push       rbp
mov        rbp, rsp

这两行是main函数的起始部分,我们知道函数的调用,需要先将当前运行到的代码地址压入堆栈,然后把函数段的地址放入代码段的指针寄存器中,这样才会在其后执行到这段代码。

上面两行代码,是一波非常虎的操作,它干了啥呢?首先将当前栈基地址压入堆栈,然后将当前栈顶指针放入基址指针寄存器,也就是说之前的栈顶变成了现在的栈底,当前栈顶栈底重合称为了一个新的空栈,对,一个新的空栈的建立仅仅用了两行机器码完成,而我们了解了这种操作之后就会猜想,当我们跨过栈基地址读到的最后一段数据是不是就是上一个堆栈的栈基地址?这样一个基地址一个基地址的跳跃是不是就可以获得操作系统boot时ASLR之后的地址了?总之,不论你想做什么,这种时候尽情的发挥你猥琐的才华就是了~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容