Memo

メモ > 技術 > プログラミング言語: Assembly > C言語で作成した実行ファイルをアセンブリ言語に変換

■C言語で作成した実行ファイルをアセンブリ言語に変換
■準備(C言語でプログラムを作成)
$ vi test.c … C言語ソースファイルを作成
#include <stdio.h> int main() { printf("Hello, world!\n"); return 0; }
$ gcc -c test.c … オブジェクトファイルを作成 $ gcc -o test test.o … リンクして実行ファイルを作成 $ gcc -o test test.c … 上記2行は、まとめてこのようにも書ける $ ./test … プログラムを実行 Hello, world!
■オブジェクトファイルのバイナリデータを確認&編集 vimでバイナリを表示し、値を変更したい - rderaログ http://d.hatena.ne.jp/rdera/20081022/1224682665
$ vi -b test.o … ファイルをバイナリモードで開く :%!xxd … 16進数形式に変換する。その後、必要に応じて編集する :%!xxd -r … テキスト形式に戻す :wq … 保存して終了
「Hello, world!」テキストに相当するバイナリデータを書き換えて、 書き換えた後の test.o から実行ファイルを作ると、確かに実行時に出力されるテキストが変わる また、実行ファイル test のバイナリを編集すれば、即座に実行結果が変更される ただし、オブジェクトファイルに比べると大量のデータになっている 諸々のファイルがリンクされて実行ファイルが作成されるため、だと思われる ■オブジェクトファイルを逆アセンブル ※「Hello, world!」というテキストが見当たらない? でも「オブジェクトファイルのバイナリデータを確認&編集」の方法で「Hello, world!」の場所は判るので、比較すれば該当箇所は判るかも Windowsプログラマに贈るLinuxプログラミング入門 - 第14回 gccをもっと詳しく知ろう:ITpro http://itpro.nikkeibp.co.jp/article/COLUMN/20090330/327214/
$ objdump -d test.o … test.oを逆アセンブル test.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: bf 00 00 00 00 mov $0x0,%edi 9: e8 00 00 00 00 callq e <main+0xe> e: b8 00 00 00 00 mov $0x0,%eax 13: c9 leaveq 14: c3 retq
■実行ファイルを逆アセンブル ※オブジェクトファイルに比べると大量のデータになっている 相変わらず「Hello, world!」というテキストが見当たらない? 「オブジェクトファイルのバイナリデータを確認&編集」の方法で「Hello, world!」の場所は判るので、比較すれば該当箇所は判るかも
$ objdump -d test … testを逆アセンブル test: file format elf64-x86-64 Disassembly of section .init: 0000000000400358 <_init>: 400358: 48 83 ec 08 sub $0x8,%rsp 40035c: e8 5b 00 00 00 callq 4003bc <call_gmon_start> 400361: e8 ea 00 00 00 callq 400450 <frame_dummy> 400366: e8 d5 01 00 00 callq 400540 <__do_global_ctors_aux> 40036b: 48 83 c4 08 add $0x8,%rsp 40036f: c3 retq Disassembly of section .plt: 0000000000400370 <__libc_start_main@plt-0x10>: 400370: ff 35 6a 04 20 00 pushq 0x20046a(%rip) # 6007e0 <_GLOBAL_OFFSET_TABLE_+0x8> 400376: ff 25 6c 04 20 00 jmpq *0x20046c(%rip) # 6007e8 <_GLOBAL_OFFSET_TABLE_+0x10> 40037c: 0f 1f 40 00 nopl 0x0(%rax) 0000000000400380 <__libc_start_main@plt>: 400380: ff 25 6a 04 20 00 jmpq *0x20046a(%rip) # 6007f0 <_GLOBAL_OFFSET_TABLE_+0x18> 400386: 68 00 00 00 00 pushq $0x0 40038b: e9 e0 ff ff ff jmpq 400370 <_init+0x18> Disassembly of section .text: 0000000000400390 <_start>: 400390: 31 ed xor %ebp,%ebp 400392: 49 89 d1 mov %rdx,%r9 400395: 5e pop %rsi 400396: 48 89 e2 mov %rsp,%rdx 400399: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp 40039d: 50 push %rax 40039e: 54 push %rsp 40039f: 49 c7 c0 a0 04 40 00 mov $0x4004a0,%r8 4003a6: 48 c7 c1 b0 04 40 00 mov $0x4004b0,%rcx 4003ad: 48 c7 c7 74 04 40 00 mov $0x400474,%rdi 4003b4: e8 c7 ff ff ff callq 400380 <__libc_start_main@plt> 4003b9: f4 hlt 4003ba: 90 nop 4003bb: 90 nop 00000000004003bc <call_gmon_start>: 4003bc: 48 83 ec 08 sub $0x8,%rsp 4003c0: 48 8b 05 09 04 20 00 mov 0x200409(%rip),%rax # 6007d0 <_DYNAMIC+0x190> 4003c7: 48 85 c0 test %rax,%rax 4003ca: 74 02 je 4003ce <call_gmon_start+0x12> 4003cc: ff d0 callq *%rax 4003ce: 48 83 c4 08 add $0x8,%rsp 4003d2: c3 retq 4003d3: 90 nop 4003d4: 90 nop 4003d5: 90 nop 4003d6: 90 nop 4003d7: 90 nop 4003d8: 90 nop 4003d9: 90 nop 4003da: 90 nop 4003db: 90 nop 4003dc: 90 nop 4003dd: 90 nop 4003de: 90 nop 4003df: 90 nop 00000000004003e0 <__do_global_dtors_aux>: 4003e0: 55 push %rbp 4003e1: 48 89 e5 mov %rsp,%rbp 4003e4: 53 push %rbx 4003e5: 48 83 ec 08 sub $0x8,%rsp 4003e9: 80 3d 20 04 20 00 00 cmpb $0x0,0x200420(%rip) # 600810 <completed.6352> 4003f0: 75 4b jne 40043d <__do_global_dtors_aux+0x5d> 4003f2: bb 30 06 60 00 mov $0x600630,%ebx 4003f7: 48 8b 05 1a 04 20 00 mov 0x20041a(%rip),%rax # 600818 <dtor_idx.6354> 4003fe: 48 81 eb 28 06 60 00 sub $0x600628,%rbx 400405: 48 c1 fb 03 sar $0x3,%rbx 400409: 48 83 eb 01 sub $0x1,%rbx 40040d: 48 39 d8 cmp %rbx,%rax 400410: 73 24 jae 400436 <__do_global_dtors_aux+0x56> 400412: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 400418: 48 83 c0 01 add $0x1,%rax 40041c: 48 89 05 f5 03 20 00 mov %rax,0x2003f5(%rip) # 600818 <dtor_idx.6354> 400423: ff 14 c5 28 06 60 00 callq *0x600628(,%rax,8) 40042a: 48 8b 05 e7 03 20 00 mov 0x2003e7(%rip),%rax # 600818 <dtor_idx.6354> 400431: 48 39 d8 cmp %rbx,%rax 400434: 72 e2 jb 400418 <__do_global_dtors_aux+0x38> 400436: c6 05 d3 03 20 00 01 movb $0x1,0x2003d3(%rip) # 600810 <completed.6352> 40043d: 48 83 c4 08 add $0x8,%rsp 400441: 5b pop %rbx 400442: c9 leaveq 400443: c3 retq 400444: 66 66 66 2e 0f 1f 84 data32 data32 nopw %cs:0x0(%rax,%rax,1) 40044b: 00 00 00 00 00 0000000000400450 <frame_dummy>: 400450: 48 83 3d e0 01 20 00 cmpq $0x0,0x2001e0(%rip) # 600638 <__JCR_END__> 400457: 00 400458: 55 push %rbp 400459: 48 89 e5 mov %rsp,%rbp 40045c: 74 12 je 400470 <frame_dummy+0x20> 40045e: b8 00 00 00 00 mov $0x0,%eax 400463: 48 85 c0 test %rax,%rax 400466: 74 08 je 400470 <frame_dummy+0x20> 400468: bf 38 06 60 00 mov $0x600638,%edi 40046d: c9 leaveq 40046e: ff e0 jmpq *%rax 400470: c9 leaveq 400471: c3 retq 400472: 90 nop 400473: 90 nop 0000000000400474 <main>: 400474: b8 04 00 00 00 mov $0x4,%eax 400479: bb 01 00 00 00 mov $0x1,%ebx 40047e: b9 fc 07 60 00 mov $0x6007fc,%ecx 400483: ba 0d 00 00 00 mov $0xd,%edx 400488: cd 80 int $0x80 40048a: b8 01 00 00 00 mov $0x1,%eax 40048f: bb 00 00 00 00 mov $0x0,%ebx 400494: cd 80 int $0x80 400496: 90 nop 400497: 90 nop 400498: 90 nop 400499: 90 nop 40049a: 90 nop 40049b: 90 nop 40049c: 90 nop 40049d: 90 nop 40049e: 90 nop 40049f: 90 nop 00000000004004a0 <__libc_csu_fini>: 4004a0: f3 c3 repz retq 4004a2: 66 66 66 66 66 2e 0f data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 4004a9: 1f 84 00 00 00 00 00 00000000004004b0 <__libc_csu_init>: 4004b0: 48 89 6c 24 d8 mov %rbp,-0x28(%rsp) 4004b5: 4c 89 64 24 e0 mov %r12,-0x20(%rsp) 4004ba: 48 8d 2d 53 01 20 00 lea 0x200153(%rip),%rbp # 600614 <__init_array_end> 4004c1: 4c 8d 25 4c 01 20 00 lea 0x20014c(%rip),%r12 # 600614 <__init_array_end> 4004c8: 4c 89 6c 24 e8 mov %r13,-0x18(%rsp) 4004cd: 4c 89 74 24 f0 mov %r14,-0x10(%rsp) 4004d2: 4c 89 7c 24 f8 mov %r15,-0x8(%rsp) 4004d7: 48 89 5c 24 d0 mov %rbx,-0x30(%rsp) 4004dc: 48 83 ec 38 sub $0x38,%rsp 4004e0: 4c 29 e5 sub %r12,%rbp 4004e3: 41 89 fd mov %edi,%r13d 4004e6: 49 89 f6 mov %rsi,%r14 4004e9: 48 c1 fd 03 sar $0x3,%rbp 4004ed: 49 89 d7 mov %rdx,%r15 4004f0: e8 63 fe ff ff callq 400358 <_init> 4004f5: 48 85 ed test %rbp,%rbp 4004f8: 74 1c je 400516 <__libc_csu_init+0x66> 4004fa: 31 db xor %ebx,%ebx 4004fc: 0f 1f 40 00 nopl 0x0(%rax) 400500: 4c 89 fa mov %r15,%rdx 400503: 4c 89 f6 mov %r14,%rsi 400506: 44 89 ef mov %r13d,%edi 400509: 41 ff 14 dc callq *(%r12,%rbx,8) 40050d: 48 83 c3 01 add $0x1,%rbx 400511: 48 39 eb cmp %rbp,%rbx 400514: 72 ea jb 400500 <__libc_csu_init+0x50> 400516: 48 8b 5c 24 08 mov 0x8(%rsp),%rbx 40051b: 48 8b 6c 24 10 mov 0x10(%rsp),%rbp 400520: 4c 8b 64 24 18 mov 0x18(%rsp),%r12 400525: 4c 8b 6c 24 20 mov 0x20(%rsp),%r13 40052a: 4c 8b 74 24 28 mov 0x28(%rsp),%r14 40052f: 4c 8b 7c 24 30 mov 0x30(%rsp),%r15 400534: 48 83 c4 38 add $0x38,%rsp 400538: c3 retq 400539: 90 nop 40053a: 90 nop 40053b: 90 nop 40053c: 90 nop 40053d: 90 nop 40053e: 90 nop 40053f: 90 nop 0000000000400540 <__do_global_ctors_aux>: 400540: 55 push %rbp 400541: 48 89 e5 mov %rsp,%rbp 400544: 53 push %rbx 400545: 48 83 ec 08 sub $0x8,%rsp 400549: 48 8b 05 c8 00 20 00 mov 0x2000c8(%rip),%rax # 600618 <__CTOR_LIST__> 400550: 48 83 f8 ff cmp $0xffffffffffffffff,%rax 400554: 74 19 je 40056f <__do_global_ctors_aux+0x2f> 400556: bb 18 06 60 00 mov $0x600618,%ebx 40055b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 400560: 48 83 eb 08 sub $0x8,%rbx 400564: ff d0 callq *%rax 400566: 48 8b 03 mov (%rbx),%rax 400569: 48 83 f8 ff cmp $0xffffffffffffffff,%rax 40056d: 75 f1 jne 400560 <__do_global_ctors_aux+0x20> 40056f: 48 83 c4 08 add $0x8,%rsp 400573: 5b pop %rbx 400574: c9 leaveq 400575: c3 retq 400576: 90 nop 400577: 90 nop Disassembly of section .fini: 0000000000400578 <_fini>: 400578: 48 83 ec 08 sub $0x8,%rsp 40057c: e8 5f fe ff ff callq 4003e0 <__do_global_dtors_aux> 400581: 48 83 c4 08 add $0x8,%rsp 400585: c3 retq

Advertisement