2012-02-08 8 views
19

少しの背景です。私はCとアセンブリコードの初心者ですが、特定のパスワードが必要なメソッドを呼び出す "bomb"割り当て(cで書かれています)がありますが、コードは表示されず、アセンブリコードを見て正しいパスワードを判断する必要があります。アセンブリコードの解読と理解

このコードは、このメソッドのパスワードが6番であることを示しています。この番号は、メソッドフェーズ2の「入力」として渡されます(私はトリガーを避けようとしています)。

私が混乱している部分は+64から+42にジャンプしています。それはループのようですが、私はどのようにスタックが各パスの影響を受けているのかわかりません。最後の2つの数字が同じであればループが終了しているように見えますが、それは4を加算したり減算したりすることと関連していますが、アドレスがどのようにトラバースされているかわかりません。 誰かが正確に何が起こっているのかを翻訳することができれば、あるいは私が特定のレジスタ/場所を見る必要がある場合、それは大きな助けになるでしょう。より複雑なものと思われる4つのフェーズがありますので、これらを読むアプローチにどのように良い理解をしたいのですか?

また、誰かが(印刷可能なテーブルのような)アセンブリコードキーワードを持っていれば助かります。また、32ビットと64ビットのレジスタ間に違いがある場合は、ここでレジスタ名..

82   phase_2(input); 
(gdb) disas phase_2 
Dump of assembler code for function phase_2: 
0x000000000040106b <phase_2+0>: push %rbp 
0x000000000040106c <phase_2+1>: push %rbx 
0x000000000040106d <phase_2+2>: sub $0x28,%rsp 
0x0000000000401071 <phase_2+6>: mov %rsp,%rsi 
0x0000000000401074 <phase_2+9>: callq 0x401457 <read_six_numbers> 
0x0000000000401079 <phase_2+14>:  cmpl $0x0,(%rsp) 
0x000000000040107d <phase_2+18>:  jne 0x401086  <phase_2+27> 
0x000000000040107f <phase_2+20>:  cmpl $0x1,0x4(%rsp) 
0x0000000000401084 <phase_2+25>:  je  0x40108b <phase_2+32> 
0x0000000000401086 <phase_2+27>:  callq 0x401421 <explode_bomb> 
0x000000000040108b <phase_2+32>:  lea 0x8(%rsp),%rbx 
0x0000000000401090 <phase_2+37>:  lea 0x18(%rsp),%rbp 
0x0000000000401095 <phase_2+42>:  mov -0x8(%rbx),%eax 
0x0000000000401098 <phase_2+45>:  add -0x4(%rbx),%eax 
0x000000000040109b <phase_2+48>:  cmp %eax,(%rbx) 
0x000000000040109d <phase_2+50>:  je  0x4010a4 <phase_2+57> 
0x000000000040109f <phase_2+52>:  callq 0x401421 <explode_bomb> 
0x00000000004010a4 <phase_2+57>:  add $0x4,%rbx 
0x00000000004010a8 <phase_2+61>:  cmp %rbp,%rbx 
0x00000000004010ab <phase_2+64>:  jne 0x401095 <phase_2+42> 
0x00000000004010ad <phase_2+66>:  add $0x28,%rsp 
0x00000000004010b1 <phase_2+70>:  pop %rbx 
0x00000000004010b2 <phase_2+71>:  pop %rbp 
0x00000000004010b3 <phase_2+72>:  retq 
+0

ウィンドウを使用している場合、私はこれをお勧めしたいと思います:http://www.ollydbg.de/ gdbを使って(私はただ知っています)、TUI、http://stackoverflow.com/a/2422063/1149736より: 'layout asm'' start' 'layout regs''ni''ni''ni' :)スタックを慎重にスタックしてください。http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7 .html – Vyktor

+9

あなたはかなりクールな先生を持っています:) –

答えて

45

フェーズ2のCと同等である:

int t[6]; 
read_six_numbers (t); 
if ((t[0] != 0) || (t[1] != 1)) { 
    explode_bomb(); 
} 

for (int i = 2; i < 6; i++) { 
     if (t[i] != t[i - 2] + t[i - 1]) { 
      explode_bomb(); 
    } 
} 

ので、パスワードがどのようにD 0、1、1、2、3、5

ですイム私はこれを行う?徐々にアセンブリをCに置き換えます。

スタックポインタ(rsp)は決して変更されません。スタックは32ビット数の配列tとして見ることができます。これは4バイト移動するたびに次の要素に移動します。つまり、0(%rsp)、4(%rsp)、...はt [0]、t [1]、...と等価です。

あなたが持っているビットの漸進的な変換問題が発生した場合:

   lea 0x8(%rsp),%rbx 
       lea 0x18(%rsp),%rbp 
<phase_2+42>: mov -0x8(%rbx),%eax 
       add -0x4(%rbx),%eax 
       cmp %eax,(%rbx) 
       je  <phase_2+57> 
       callq explode_bomb 
<phase_2+57>: add $0x4,%rbx 
       cmp %rbp,%rbx 
       jne phase_2+42 
------------------------------------------------------ 
        rbx = rsp + 8; 
        rbp = rsp + 24; 
<phase_2+42>:  eax = [rbx - 8]; 
        eax += [rbx - 4]; 
        if (eax == [rbx]) goto <phase_2+57>; 
        explode_bomb(); 
<phase_2+57>:  rbx += 4; 
        if (rbx != rbp) goto phase_2+42; 
------------------------------------------------------ 
rbx = rsp + 8; 
rbp = rsp + 24; 
do { 
    eax = [rbx - 8] + [rbx - 4]; 
     if (eax != [rbx]) { 
     explode_bomb(); 
    } 
     rbx += 4; 
} while (rbx != rbp); 
------------------------------------------------------ 
rbx = 8; 
do { 
    eax = [rsp + rbx - 8] + [rsp + rbx - 4]; 
     if (eax != [rsp + rbx]) { 
     explode_bomb(); 
    } 
     rbx += 4; 
} while (rbx < 24); 
------------------------------------------------------ 
i = 2; 
do { 
    eax = t[i - 2] + t[i - 1]; 
     if (eax != t[i]) { 
     explode_bomb(); 
    } 
     i += 1; 
} while (i < 6); 
------------------------------------------------------ 
for (int i = 2; i < 6; i++) { 
    if (t[i] != t[i - 2] + t[i - 1]) { 
      explode_bomb(); 
     } 
} 

これらの変換を理解する時間があれば、アセンブリのすべての部分を変換して理解することができます。

+1

よく書かれて、+1。 –

関連する問題