cs:app 學習筆記(3)metore

c程序

// mstore.c
long mult2(long, long);
void multstore(long x, long y, long *dest){
    long t = mult2(x, y);
    *dest = t;
}

使用編譯器編譯成彙編語言

  • 編譯命令
gcc -Og -S mstore.c
  • 內容如下
    .file   "mstore.c"
    .text
    .globl  multstore
    .type   multstore, @function
multstore:
.LFB0:
    .cfi_startproc
    pushq   %rbx
    .cfi_def_cfa_offset 16
    .cfi_offset 3, -16
    movq    %rdx, %rbx
    call    mult2
    movq    %rax, (%rbx)
    popq    %rbx
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE0:
    .size   multstore, .-multstore
    .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609"
    .section    .note.GNU-stack,"",@progbits
  • 包括下面幾行
multstore:
    pushq   %rbx
    movq    %rdx, %rbx
    call    mult2
    movq    %rax, (%rbx)
    popq    %rbx
    ret
  • 每一行對應一個機器指令
  • 然後編譯成二進制文件
gcc -Og -c mstore.c
  • 將其反彙編
objdump -d mstore.o

二進制代碼與彙編語言

Disassembly of section .text:

0000000000000000 <multstore>:
   0:   53                      push   %rbx
   1:   48 89 d3                mov    %rdx,%rbx
   4:   e8 00 00 00 00          callq  9 <multstore+0x9>
   9:   48 89 03                mov    %rax,(%rbx)
   c:   5b                      pop    %rbx
   d:   c3                      retq   

另一個c文件 main.c

#include <stdio.h>
void multstore(long, long, long *);
int main(){
    long d;
    multstore(2,3,&d);
    printf("2 * 3 --> %ld\n", d);
    return 0;
}
long mult2(long a, long b){
    long s = a * b;
    return s;
}
  • 編譯
gcc -Og -o prog main.c mstore.c

再一次反彙編

objdump -d prog 
  • 顯示如下
prog:     文件格式 elf64-x86-64


Disassembly of section .init:

0000000000400448 <_init>:
  400448:   48 83 ec 08             sub    $0x8,%rsp
  40044c:   48 8b 05 a5 0b 20 00    mov    0x200ba5(%rip),%rax        # 600ff8 <_DYNAMIC+0x1d0>
  400453:   48 85 c0                test   %rax,%rax
  400456:   74 05                   je     40045d <_init+0x15>
  400458:   e8 53 00 00 00          callq  4004b0 <__printf_chk@plt+0x10>
  40045d:   48 83 c4 08             add    $0x8,%rsp
  400461:   c3                      retq   

Disassembly of section .plt:

0000000000400470 <__stack_chk_fail@plt-0x10>:
  400470:   ff 35 92 0b 20 00       pushq  0x200b92(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
  400476:   ff 25 94 0b 20 00       jmpq   *0x200b94(%rip)        # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
  40047c:   0f 1f 40 00             nopl   0x0(%rax)

0000000000400480 <__stack_chk_fail@plt>:
  400480:   ff 25 92 0b 20 00       jmpq   *0x200b92(%rip)        # 601018 <_GLOBAL_OFFSET_TABLE_+0x18>
  400486:   68 00 00 00 00          pushq  $0x0
  40048b:   e9 e0 ff ff ff          jmpq   400470 <_init+0x28>

0000000000400490 <__libc_start_main@plt>:
  400490:   ff 25 8a 0b 20 00       jmpq   *0x200b8a(%rip)        # 601020 <_GLOBAL_OFFSET_TABLE_+0x20>
  400496:   68 01 00 00 00          pushq  $0x1
  40049b:   e9 d0 ff ff ff          jmpq   400470 <_init+0x28>

00000000004004a0 <__printf_chk@plt>:
  4004a0:   ff 25 82 0b 20 00       jmpq   *0x200b82(%rip)        # 601028 <_GLOBAL_OFFSET_TABLE_+0x28>
  4004a6:   68 02 00 00 00          pushq  $0x2
  4004ab:   e9 c0 ff ff ff          jmpq   400470 <_init+0x28>

Disassembly of section .plt.got:

00000000004004b0 <.plt.got>:
  4004b0:   ff 25 42 0b 20 00       jmpq   *0x200b42(%rip)        # 600ff8 <_DYNAMIC+0x1d0>
  4004b6:   66 90                   xchg   %ax,%ax

Disassembly of section .text:

00000000004004c0 <_start>:
  4004c0:   31 ed                   xor    %ebp,%ebp
  4004c2:   49 89 d1                mov    %rdx,%r9
  4004c5:   5e                      pop    %rsi
  4004c6:   48 89 e2                mov    %rsp,%rdx
  4004c9:   48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
  4004cd:   50                      push   %rax
  4004ce:   54                      push   %rsp
  4004cf:   49 c7 c0 a0 06 40 00    mov    $0x4006a0,%r8
  4004d6:   48 c7 c1 30 06 40 00    mov    $0x400630,%rcx
  4004dd:   48 c7 c7 b6 05 40 00    mov    $0x4005b6,%rdi
  4004e4:   e8 a7 ff ff ff          callq  400490 <__libc_start_main@plt>
  4004e9:   f4                      hlt    
  4004ea:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)

00000000004004f0 <deregister_tm_clones>:
  4004f0:   b8 47 10 60 00          mov    $0x601047,%eax
  4004f5:   55                      push   %rbp
  4004f6:   48 2d 40 10 60 00       sub    $0x601040,%rax
  4004fc:   48 83 f8 0e             cmp    $0xe,%rax
  400500:   48 89 e5                mov    %rsp,%rbp
  400503:   76 1b                   jbe    400520 <deregister_tm_clones+0x30>
  400505:   b8 00 00 00 00          mov    $0x0,%eax
  40050a:   48 85 c0                test   %rax,%rax
  40050d:   74 11                   je     400520 <deregister_tm_clones+0x30>
  40050f:   5d                      pop    %rbp
  400510:   bf 40 10 60 00          mov    $0x601040,%edi
  400515:   ff e0                   jmpq   *%rax
  400517:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
  40051e:   00 00 
  400520:   5d                      pop    %rbp
  400521:   c3                      retq   
  400522:   0f 1f 40 00             nopl   0x0(%rax)
  400526:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  40052d:   00 00 00 

0000000000400530 <register_tm_clones>:
  400530:   be 40 10 60 00          mov    $0x601040,%esi
  400535:   55                      push   %rbp
  400536:   48 81 ee 40 10 60 00    sub    $0x601040,%rsi
  40053d:   48 c1 fe 03             sar    $0x3,%rsi
  400541:   48 89 e5                mov    %rsp,%rbp
  400544:   48 89 f0                mov    %rsi,%rax
  400547:   48 c1 e8 3f             shr    $0x3f,%rax
  40054b:   48 01 c6                add    %rax,%rsi
  40054e:   48 d1 fe                sar    %rsi
  400551:   74 15                   je     400568 <register_tm_clones+0x38>
  400553:   b8 00 00 00 00          mov    $0x0,%eax
  400558:   48 85 c0                test   %rax,%rax
  40055b:   74 0b                   je     400568 <register_tm_clones+0x38>
  40055d:   5d                      pop    %rbp
  40055e:   bf 40 10 60 00          mov    $0x601040,%edi
  400563:   ff e0                   jmpq   *%rax
  400565:   0f 1f 00                nopl   (%rax)
  400568:   5d                      pop    %rbp
  400569:   c3                      retq   
  40056a:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)

0000000000400570 <__do_global_dtors_aux>:
  400570:   80 3d c9 0a 20 00 00    cmpb   $0x0,0x200ac9(%rip)        # 601040 <__TMC_END__>
  400577:   75 11                   jne    40058a <__do_global_dtors_aux+0x1a>
  400579:   55                      push   %rbp
  40057a:   48 89 e5                mov    %rsp,%rbp
  40057d:   e8 6e ff ff ff          callq  4004f0 <deregister_tm_clones>
  400582:   5d                      pop    %rbp
  400583:   c6 05 b6 0a 20 00 01    movb   $0x1,0x200ab6(%rip)        # 601040 <__TMC_END__>
  40058a:   f3 c3                   repz retq 
  40058c:   0f 1f 40 00             nopl   0x0(%rax)

0000000000400590 <frame_dummy>:
  400590:   bf 20 0e 60 00          mov    $0x600e20,%edi
  400595:   48 83 3f 00             cmpq   $0x0,(%rdi)
  400599:   75 05                   jne    4005a0 <frame_dummy+0x10>
  40059b:   eb 93                   jmp    400530 <register_tm_clones>
  40059d:   0f 1f 00                nopl   (%rax)
  4005a0:   b8 00 00 00 00          mov    $0x0,%eax
  4005a5:   48 85 c0                test   %rax,%rax
  4005a8:   74 f1                   je     40059b <frame_dummy+0xb>
  4005aa:   55                      push   %rbp
  4005ab:   48 89 e5                mov    %rsp,%rbp
  4005ae:   ff d0                   callq  *%rax
  4005b0:   5d                      pop    %rbp
  4005b1:   e9 7a ff ff ff          jmpq   400530 <register_tm_clones>

00000000004005b6 <main>:
  4005b6:   48 83 ec 18             sub    $0x18,%rsp
  4005ba:   64 48 8b 04 25 28 00    mov    %fs:0x28,%rax
  4005c1:   00 00 
  4005c3:   48 89 44 24 08          mov    %rax,0x8(%rsp)
  4005c8:   31 c0                   xor    %eax,%eax
  4005ca:   48 89 e2                mov    %rsp,%rdx
  4005cd:   be 03 00 00 00          mov    $0x3,%esi
  4005d2:   bf 02 00 00 00          mov    $0x2,%edi
  4005d7:   e8 3f 00 00 00          callq  40061b <multstore>
  4005dc:   48 8b 14 24             mov    (%rsp),%rdx
  4005e0:   be b4 06 40 00          mov    $0x4006b4,%esi
  4005e5:   bf 01 00 00 00          mov    $0x1,%edi
  4005ea:   b8 00 00 00 00          mov    $0x0,%eax
  4005ef:   e8 ac fe ff ff          callq  4004a0 <__printf_chk@plt>
  4005f4:   48 8b 4c 24 08          mov    0x8(%rsp),%rcx
  4005f9:   64 48 33 0c 25 28 00    xor    %fs:0x28,%rcx
  400600:   00 00 
  400602:   74 05                   je     400609 <main+0x53>
  400604:   e8 77 fe ff ff          callq  400480 <__stack_chk_fail@plt>
  400609:   b8 00 00 00 00          mov    $0x0,%eax
  40060e:   48 83 c4 18             add    $0x18,%rsp
  400612:   c3                      retq   

0000000000400613 <mult2>:
  400613:   48 89 f8                mov    %rdi,%rax
  400616:   48 0f af c6             imul   %rsi,%rax
  40061a:   c3                      retq   

000000000040061b <multstore>:
  40061b:   53                      push   %rbx
  40061c:   48 89 d3                mov    %rdx,%rbx
  40061f:   e8 ef ff ff ff          callq  400613 <mult2>
  400624:   48 89 03                mov    %rax,(%rbx)
  400627:   5b                      pop    %rbx
  400628:   c3                      retq   
  400629:   0f 1f 80 00 00 00 00    nopl   0x0(%rax)

0000000000400630 <__libc_csu_init>:
  400630:   41 57                   push   %r15
  400632:   41 56                   push   %r14
  400634:   41 89 ff                mov    %edi,%r15d
  400637:   41 55                   push   %r13
  400639:   41 54                   push   %r12
  40063b:   4c 8d 25 ce 07 20 00    lea    0x2007ce(%rip),%r12        # 600e10 <__frame_dummy_init_array_entry>
  400642:   55                      push   %rbp
  400643:   48 8d 2d ce 07 20 00    lea    0x2007ce(%rip),%rbp        # 600e18 <__init_array_end>
  40064a:   53                      push   %rbx
  40064b:   49 89 f6                mov    %rsi,%r14
  40064e:   49 89 d5                mov    %rdx,%r13
  400651:   4c 29 e5                sub    %r12,%rbp
  400654:   48 83 ec 08             sub    $0x8,%rsp
  400658:   48 c1 fd 03             sar    $0x3,%rbp
  40065c:   e8 e7 fd ff ff          callq  400448 <_init>
  400661:   48 85 ed                test   %rbp,%rbp
  400664:   74 20                   je     400686 <__libc_csu_init+0x56>
  400666:   31 db                   xor    %ebx,%ebx
  400668:   0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
  40066f:   00 
  400670:   4c 89 ea                mov    %r13,%rdx
  400673:   4c 89 f6                mov    %r14,%rsi
  400676:   44 89 ff                mov    %r15d,%edi
  400679:   41 ff 14 dc             callq  *(%r12,%rbx,8)
  40067d:   48 83 c3 01             add    $0x1,%rbx
  400681:   48 39 eb                cmp    %rbp,%rbx
  400684:   75 ea                   jne    400670 <__libc_csu_init+0x40>
  400686:   48 83 c4 08             add    $0x8,%rsp
  40068a:   5b                      pop    %rbx
  40068b:   5d                      pop    %rbp
  40068c:   41 5c                   pop    %r12
  40068e:   41 5d                   pop    %r13
  400690:   41 5e                   pop    %r14
  400692:   41 5f                   pop    %r15
  400694:   c3                      retq   
  400695:   90                      nop
  400696:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  40069d:   00 00 00 

00000000004006a0 <__libc_csu_fini>:
  4006a0:   f3 c3                   repz retq 

Disassembly of section .fini:

00000000004006a4 <_fini>:
  4006a4:   48 83 ec 08             sub    $0x8,%rsp
  4006a8:   48 83 c4 08             add    $0x8,%rsp
  4006ac:   c3                      retq   
  • 有如下一段
000000000040061b <multstore>:
  40061b:   53                      push   %rbx
  40061c:   48 89 d3                mov    %rdx,%rbx
  40061f:   e8 ef ff ff ff          callq  400613 <mult2>
  400624:   48 89 03                mov    %rax,(%rbx)
  400627:   5b                      pop    %rbx
  400628:   c3                      retq   
  400629:   0f 1f 80 00 00 00 00    nopl   0x0(%rax)
  • 這段代碼與mstore.c 反彙編產生的代碼幾乎一模一樣,但又三個區別。

    1. 左邊的地址不同——鏈接器將這段代碼移動到一段不同的地址範圍中,
    2. 鏈接器填上了callq 指令調用函數mult2 需要使用的地址。鏈接器的任務之一就是爲函數調用找到匹配的函數的可執行的代碼的位置。
    3. 最後多了兩行代碼。對於程序沒影響,這是爲了函數代碼變爲16字節,使得就存儲器系統性能而言,更好地放置下一個代碼塊。
  • 其中,以. 開頭的命令都是指導彙編器與鏈接器工作的僞指令。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章