逆向工程

[汇编]gcc生成汇编.s文件 $ gcc -Og -S sum

2018-09-05  本文已影响84人  AkuRinbu

目录

- C语言源码文件:sum.c

- gcc 生成的汇编语言文件 sum.s
    x86-64 AT&T 语法格式
    x86-64 Intel格式

- 反汇编 objdump
    3.1 输出 AT&T格式 objdump -d sum
    3.2 输出 Intel格式 objdump -M intel -d sum

C语言源码文件:sum.c

#include<stdio.h>
int main(int argc,char *argv[])
{

    int a = 1;
    int b = 2;
    int c = 0;
    c = a+b;
    printf("%d",c);

    return 0;
}

gcc 生成的汇编语言文件 sum.s

x86-64 处理器 AT&T 格式

    .file   "sum.c"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "%d"
    .text
    .globl  main
    .type   main, @function
main:
.LFB24:
    .cfi_startproc
    subq    $8, %rsp
    .cfi_def_cfa_offset 16
    movl    $3, %edx
    movl    $.LC0, %esi
    movl    $1, %edi
    movl    $0, %eax
    call    __printf_chk
    movl    $0, %eax
    addq    $8, %rsp
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE24:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4"
    .section    .note.GNU-stack,"",@progbits

x86-64 处理器 Intel格式

    .file   "sum.c"
    .intel_syntax noprefix
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "%d"
    .text
    .globl  main
    .type   main, @function
main:
.LFB24:
    .cfi_startproc
    sub rsp, 8
    .cfi_def_cfa_offset 16
    mov edx, 3
    mov esi, OFFSET FLAT:.LC0
    mov edi, 1
    mov eax, 0
    call    __printf_chk
    mov eax, 0
    add rsp, 8
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE24:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4"
    .section    .note.GNU-stack,"",@progbits

反汇编 objdump

1、 生成可执行文件 sum

anno@anno-m:~/Desktop$ gcc -Og -o sum sum.c

2、查看当前文件结构

anno@anno-m:~/Desktop$ ls
sum  sum.c  sum.s

3.1 输出 AT&T格式 objdump -d sum

直接显示在屏幕上
anno@anno-m:~/Desktop$ objdump -d sum 

输出到指定文件,ATT.me 是自己取得名字,随便写
anno@anno-m:~/Desktop$ objdump -d sum > ATT.me
000000000040055d <main>:
  40055d:   48 83 ec 08             sub    $0x8,%rsp
  400561:   ba 03 00 00 00          mov    $0x3,%edx
  400566:   be 14 06 40 00          mov    $0x400614,%esi
  40056b:   bf 01 00 00 00          mov    $0x1,%edi
  400570:   b8 00 00 00 00          mov    $0x0,%eax
  400575:   e8 e6 fe ff ff          callq  400460 <__printf_chk@plt>
  40057a:   b8 00 00 00 00          mov    $0x0,%eax
  40057f:   48 83 c4 08             add    $0x8,%rsp
  400583:   c3                      retq   
  400584:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  40058b:   00 00 00 
  40058e:   66 90                   xchg   %ax,%ax

3.2 输出 Intel格式 objdump -M intel -d sum

直接显示在屏幕上
anno@anno-m:~/Desktop$ objdump -M intel -d sum

输出到指定文件,Intel.me 是自己取得名字,随便写
anno@anno-m:~/Desktop$ objdump -M intel -d sum > Intel.me
000000000040055d <main>:
  40055d:   48 83 ec 08             sub    rsp,0x8
  400561:   ba 03 00 00 00          mov    edx,0x3
  400566:   be 14 06 40 00          mov    esi,0x400614
  40056b:   bf 01 00 00 00          mov    edi,0x1
  400570:   b8 00 00 00 00          mov    eax,0x0
  400575:   e8 e6 fe ff ff          call   400460 <__printf_chk@plt>
  40057a:   b8 00 00 00 00          mov    eax,0x0
  40057f:   48 83 c4 08             add    rsp,0x8
  400583:   c3                      ret    
  400584:   66 2e 0f 1f 84 00 00    nop    WORD PTR cs:[rax+rax*1+0x0]
  40058b:   00 00 00 
  40058e:   66 90                   xchg   ax,ax

4、小小的观察

5、 再次看文件结构

anno@anno-m:~/Desktop$ ls
ATT.me  Intel.me  sum  sum.c  sum.s

截图参考

[生成汇编文件.s X86-64 AT&T格式]gcc -Og -S sum.c [生成汇编文件.s X86-64 Intel格式]gcc -Og -S -masm=intel sum.c

引用参考

  • How can objdump emit intel syntax
    How can I tell objdump to emit assembly in Intel Syntax rather than the default AT&T syntax?
    Q:怎样告诉objdump"我想要(反汇编出来)Intel格式 的汇编代码,我不要默认的 AT&T格式 的”
    A:objdump -M intel -d program_name
上一篇下一篇

猜你喜欢

热点阅读