-2

重複の可能性:
アセンブリ コードのデコードと理解

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

このコードは、このメソッドのパスワードが 6 つの数字であることを示しています。これは、「入力」としてメソッド puzzle_1 に渡されます (トリガーを回避しようとしています)。

アセンブリ コードが理解できません。

この質問に対する答えは何ですか?

この puzzle_1 のキーワードは配列だと思います。

08048db4 <puzzle_1>:
8048db4:        push   %ebp
8048db5:        mov    %esp,%ebp
8048db7:        sub    $0x38,%esp
8048dba:        lea    -0x24(%ebp),%eax
8048dbd:        mov    %eax,0x4(%esp)
8048dc1:        mov    0x8(%ebp),%eax
8048dc4:        mov    %eax,(%esp)
8048dc7:        call   804897e <read_six_numbers>
8048dcc:        movl   $0x1,-0xc(%ebp)
8048dd3:        jmp    8048df9 <puzzle_1+0x45>
8048dd5:        mov    -0xc(%ebp),%eax
8048dd8:        mov    -0x24(%ebp,%eax,4),%eax
8048ddc:        mov    -0xc(%ebp),%edx
8048ddf:         sub    $0x1,%edx
8048de2:        mov    -0x24(%ebp,%edx,4),%edx
8048de6:        add    $0xbf,%edx
8048dec:        cmp    %edx,%eax
8048dee:        je     8048df5 <puzzle_1+0x41>
8048df0:         call   8048d93 <denied_nextstep>
8048df5:         addl   $0x1,-0xc(%ebp)
8048df9:         cmpl   $0x5,-0xc(%ebp)
8048dfd:         jle    8048dd5 <puzzle_1+0x21>
8048dff:          call   8048d73 <allow_nextstep>
8048e04:        leave  
8048e05:        ret
4

2 に答える 2

2

組み立てを学ぶ必要があります。自分で答えを見つけるための簡単な入門書は、ニーモニックをその目的にマップする表、さまざまなアドレス指定モードの表、16 進数を 10 進数にマップするための計算機を使用して、手順を 1 つずつ順を追って説明することです。頭の中でやる必要はありません。また、何かわからないときに調査を行うための古き良きインターネット接続も必要です。

たとえば、ここに最初のいくつかの指示があります...

; Push the value in %ebp register onto stack
8048db4:        push   %ebp

; Copy the value from %esp register into %ebp register
8048db5:        mov    %esp,%ebp

; Subtract 0x38 from %esp register
8048db7:        sub    $0x38,%esp

; Wasn't sure about this one, so I looked it up
; (Looking up things you're not sure of is a 
;  good way to learn about those things.)
; http://stackoverflow.com/q/1658294/31671
8048dba:        lea    -0x24(%ebp),%eax
于 2012-11-18T09:49:15.447 に答える
2

ここでは、次の 3 つのカテゴリを理解する必要があります。

1) コンピューターのアーキテクチャー:

  • レジスタ アーキテクチャ / 命令セット アーキテクチャ
    • 算術演算 (a+b など)
    • a OR b などのビットごとの論理
    • 符号付きと符号なしの異なるフラグを持つ条件 ( a == b または a < b など)
      • cmp %edx,%eax
    • ジャンピング
      • 無条件:jmp
      • 条件付き: je; jleなど --条件コードまたはフラグまたはステータス レジスタに関連するもの
      • サブルーチン: call;
    • メモリ アーキテクチャ
    • さまざまな種類のアドレッシング モード
      • すぐにsub $0x38,%esp
    • メモリアドレス計算lea -0x24(%ebp),%eax
    • CISC タイプ: メモリ アドレスに直接「追加」できますか addl $0x1,-0xc(%ebp)
    • RISC タイプ - READ / MODIFY / WRITE back

2) 言語の構文

  • 命令 src、dst と instr dst、src
  • ラベル、コメント、アセンブラ指令、10 進数と 16 進数のエンコード

3) ローカルスタックフレーム、ローカル変数、ポインタの概念

  • push ebp; mov esp, ebp;
  • この特定の例で使用される呼び出し規則 (グローバル レジスタ、汎用レジスタ、またはスタック (フレーム)
  • レジスタに適合しないアイテムは、通常、ポインターで渡されます

これを学習する最善の方法は、メモリとレジスタの内容を表示し、各命令間の変更を最適に強調表示する命令レベルのデバッガーを使用することです。もちろん、Instruction Set Architecture マニュアルと Application Binary Interface 仕様も読んでください。

幸運を!

于 2012-11-18T10:23:19.170 に答える