私は現在ASMプログラミングを学んでおり、ファイルを逆アセンブリしたいと思っています.c
。しかし、コマンドラインを実行した後
set disassembly-flavor test.c
次のコマンドを使用します:
disassembly test.c
そして私の端末には
disassemble: command not found
私のコンピューターで「disassemble」コマンドを実行できるかどうか知っている人はいますか?
ありがとう
答え1
まず、拡張子を持つファイルは、.c
おそらく C ソース ファイルです。これを逆アセンブルしても意味がありません。ファイルが実際にプログラムであることを確認するには、次のfile
コマンドを使用します。
$ file test.c
test.c: ASCII text
$ file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.24,
BuildID[sha1]=54967822da027467f21e65a1eac7576dec7dd821, stripped
逆アセンブルに関しては、objdump
代わりに を使用してください。man ページから:
NAME
objdump - display information from object files.
SYNOPSIS
objdump [...]
[-d|--disassemble]
例えば、 というファイルを逆アセンブルするにはa.out
、次のようにします。
$ objdump -d a.out
a.out: file format elf64-x86-64
Disassembly of section .init:
00000000004003a8 <_init>:
4003a8: 48 83 ec 08 sub $0x8,%rsp
4003ac: 48 8b 05 45 0c 20 00 mov 0x200c45(%rip),%rax # 600ff8 <_DYNAMIC+0x1d0>
4003b3: 48 85 c0 test %rax,%rax
4003b6: 74 05 je 4003bd <_init+0x15>
4003b8: e8 33 00 00 00 callq 4003f0 <__gmon_start__@plt>
4003bd: 48 83 c4 08 add $0x8,%rsp
4003c1: c3 retq
[...] and so on...
答え2
必要なのは、逆アセンブル コマンドを持つ gnu デバッガー gdb の機能だと思います。まず、次のようにデバッグ フラグをオンにして test.c をコンパイルします。
gcc -Wall -g -o test test.c
またはそれに似たもの。次に、gdb を引数としてアプリケーションを実行します。
gdb test
gdb に入ったら、次のように逆アセンブル コマンドを使用できます。
(gdb) break main
(gdb) disassemble main
test.cpp という簡単なプログラムを見てみましょう。
#include <iostream>
using namespace std;
int main ()
{
int a=0;
for (int b = 0; b < 11; b++){
a=b+2;
cout << a << "\n\t";
}
cout << "Hello World \n";
return 0;
}
デバッグフラグを付けてコンパイルします:
g++ -Wall -g test.cpp -o test
すると、j0h さん、これは C に関する質問ですが... と言う人がいるかもしれませんが、gdb はどの言語を使用しているかは気にしません。c、c++、アセンブリ、fortran、その他さまざまなものをデバッグおよび逆アセンブルできます。-g オプションでコンパイルするだけです。これが重要なのです。
プログラムを gdb にロードし、main を中断すると、逆アセンブルを実行できます。
Breakpoint 1 at 0x4007da
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004007d6 <+0>: push %rbp
0x00000000004007d7 <+1>: mov %rsp,%rbp
0x00000000004007da <+4>: sub $0x10,%rsp
0x00000000004007de <+8>: movl $0x0,-0x4(%rbp)
0x00000000004007e5 <+15>: movl $0x0,-0x8(%rbp)
0x00000000004007ec <+22>: jmp 0x400817 <main+65>
0x00000000004007ee <+24>: mov -0x8(%rbp),%eax
0x00000000004007f1 <+27>: add $0x2,%eax
0x00000000004007f4 <+30>: mov %eax,-0x4(%rbp)
0x00000000004007f7 <+33>: mov -0x4(%rbp),%eax
0x00000000004007fa <+36>: mov %eax,%esi
0x00000000004007fc <+38>: mov $0x601080,%edi
0x0000000000400801 <+43>: callq 0x400670 <_ZNSolsEi@plt>
0x0000000000400806 <+48>: mov $0x400914,%esi
0x000000000040080b <+53>: mov %rax,%rdi
---Type <return> to continue, or q <return> to quit---
チュートリアルはこちらです: http://www.unknownroad.com/rtfm/gdbtut/gdbadvanced.html
objdump は内容を一覧表示できますが、デバッガーを使用する場合と同じようにコードを操作できるとは思いません。