2016-11-15 7 views
1

を解釈/ジャンプテーブルを読んで、私はいくつかのアセンブリをリバースエンジニアリングしようとしている、と私は、このポイントに得ている:ガスx86の:switch文

40073f: 89 45 fc    mov %eax,-0x4(%rbp) 
    400742: 83 7d fc 05    cmpl $0x5,-0x4(%rbp) 
    400746: 77 37     ja  40077f <f51+0x85> 
    400748: 8b 45 fc    mov -0x4(%rbp),%eax 
    40074b: 48 8b 04 c5 28 09 40 mov 0x400928(,%rax,8),%rax 
    400752: 00 
    400753: ff e0     jmpq *%rax 
    400755: b8 11 00 00 00   mov $0x11,%eax 
    40075a: eb 28     jmp 400784 <f51+0x8a> 
    40075c: b8 12 00 00 00   mov $0x12,%eax 
    400761: eb 21     jmp 400784 <f51+0x8a> 
    400763: b8 13 00 00 00   mov $0x13,%eax 
    400768: eb 1a     jmp 400784 <f51+0x8a> 
    40076a: b8 14 00 00 00   mov $0x14,%eax 
    40076f: eb 13     jmp 400784 <f51+0x8a> 
    400771: b8 15 00 00 00   mov $0x15,%eax 
    400776: eb 0c     jmp 400784 <f51+0x8a> 
    400778: b8 16 00 00 00   mov $0x16,%eax 
    40077d: eb 05     jmp 400784 <f51+0x8a> 
    40077f: b8 0a 00 00 00   mov $0xa,%eax 
    400784: 5d      pop %rbp 
    400785: c3      retq 

私は私が探しているものをすることを見ることができますここではデフォルトのケースが-0x4(%rbp)> 5のときのswitch文ですが、私はいくつかの指示について混乱しています:

40074bはジャンプテーブル上の場所に移動し、 raxに入れて、それ以降のスイッチケースの適切な場所にジャンプすることができます(行番号400753)。

この場合、異なるケースをどのように解釈するかわかりません。私の理解が正しければ、ジャンプテーブルは、私が見るそこに行く、アドレス400928から始まる:

400928: 55      push %rbp 
    400929: 07      (bad) 
    40092a: 40 00 00    add %al,(%rax) 
    40092d: 00 00     add %al,(%rax) 
    40092f: 00 5c 07 40    add %bl,0x40(%rdi,%rax,1) 
    400933: 00 00     add %al,(%rax) 
    400935: 00 00     add %al,(%rax) 
    400937: 00 63 07    add %ah,0x7(%rbx) 
    40093a: 40 00 00    add %al,(%rax) 
    40093d: 00 00     add %al,(%rax) 
    40093f: 00 6a 07    add %ch,0x7(%rdx) 
    400942: 40 00 00    add %al,(%rax) 
    400945: 00 00     add %al,(%rax) 
    400947: 00 71 07    add %dh,0x7(%rcx) 
    40094a: 40 00 00    add %al,(%rax) 
    40094d: 00 00     add %al,(%rax) 
    40094f: 00 78 07    add %bh,0x7(%rax) 
    400952: 40 00 00    add %al,(%rax) 
    400955: 00 00     add %al,(%rax) 

この時点で私は私が探しているものの小さなアイデアを持っています。恐らく400753行目でこのテーブルのどこかにジャンプしますが、それでは何ですか?または私の理解は完全にオフですか?

+0

.rodataの0x400928ですか?それがちょうど.textセクションにあり、コードと混ざり合っていれば、それは変です。通常、CPUには分割キャッシュ(および別々のdTLB/iTLB)があるため、パフォーマンス上の理由からデータとコードを別々にグループ化します。 –

+0

それは.rodataにあります – nichow

+0

だから、その非コードを逆アセンブルするには '-D'か何かを使わなければなりません。今度は、あなたのツールがあなたのためにそれを逆アセンブルしたくない理由を知っています:P –

答えて

3

ジャンプテーブルは、コードではなくポインタの配列です。ディスアセンブラはそれを知らないので、バイトを命令としてデコードします。

400928: 55      push %rbp 
400929: 07      (bad) 
40092a: 40 00 00    add %al,(%rax) 
40092d: 00 00     add %al,(%rax) 
40092f: 00 5c 07 40    add %bl,0x40(%rdi,%rax,1) 

最初の8つのバイトは55 07 40 00 00 00 00 00あり、命令へのポインタを0x400755で:あなたはそれを無視して、ちょうどバイトを見ています。そこにはcase 0があります。

+0

を見てみると、他の数字ではなく、大文字小文字が区別されています。 – nichow

+1

@nichow:配列のインデックスとして 'switch()'オペランドを直接使用しています。add/subはそれをオフセットするものではありません。それが以前のコードで起こっていない限り、あなたは表示しませんでした。 –