-3
08048544 <compare_password>:
 8048544:   55                      push   %ebp
 8048545:   89 e5                   mov    %esp,%ebp
 8048547:   83 ec 38                sub    $0x38,%esp
 804854a:   8b 45 0c                mov    0xc(%ebp),%eax
 804854d:   89 45 d4                mov    %eax,-0x2c(%ebp)
 8048550:   65 a1 14 00 00 00       mov    %gs:0x14,%eax
 8048556:   89 45 f4                mov    %eax,-0xc(%ebp)
 8048559:   31 c0                   xor    %eax,%eax
 804855b:   c7 45 e4 00 00 00 00    movl   $0x0,-0x1c(%ebp)
 8048562:   c7 45 e0 00 00 00 00    movl   $0x0,-0x20(%ebp)
 8048569:   eb 22                   jmp    804858d <compare_password+0x49>
 804856b:   8b 45 e0                mov    -0x20(%ebp),%eax
 804856e:   03 45 d4                add    -0x2c(%ebp),%eax
 8048571:   0f b6 10                movzbl (%eax),%edx
 8048574:   8b 45 e0                mov    -0x20(%ebp),%eax
 8048577:   05 44 a1 04 08          add    $0x804a144,%eax
 804857c:   0f b6 00                movzbl (%eax),%eax
 804857f:   31 c2                   xor    %eax,%edx
 8048581:   8d 45 ea                lea    -0x16(%ebp),%eax
 8048584:   03 45 e0                add    -0x20(%ebp),%eax
 8048587:   88 10                   mov    %dl,(%eax)
 8048589:   83 45 e0 01             addl   $0x1,-0x20(%ebp)
 804858d:   83 7d e0 09             cmpl   $0x9,-0x20(%ebp)
 8048591:   7e d8                   jle    804856b <compare_password+0x27>
 8048593:   c7 45 e0 00 00 00 00    movl   $0x0,-0x20(%ebp)
 804859a:   eb 2c                   jmp    80485c8 <compare_password+0x84>
 804859c:   8b 55 08                mov    0x8(%ebp),%edx
 804859f:   89 d0                   mov    %edx,%eax
 80485a1:   c1 e0 02                shl    $0x2,%eax
 80485a4:   01 d0                   add    %edx,%eax
 80485a6:   01 c0                   add    %eax,%eax
 80485a8:   03 45 e0                add    -0x20(%ebp),%eax
 80485ab:   05 e0 a0 04 08          add    $0x804a0e0,%eax
 80485b0:   0f b6 10                movzbl (%eax),%edx
 80485b3:   8d 45 ea                lea    -0x16(%ebp),%eax
 80485b6:   03 45 e0                add    -0x20(%ebp),%eax
 80485b9:   0f b6 00                movzbl (%eax),%eax
 80485bc:   38 c2                   cmp    %al,%dl
 80485be:   75 04                   jne    80485c4 <compare_password+0x80>
 80485c0:   83 45 e4 01             addl   $0x1,-0x1c(%ebp)
 80485c4:   83 45 e0 01             addl   $0x1,-0x20(%ebp)
 80485c8:   83 7d e0 09             cmpl   $0x9,-0x20(%ebp)
 80485cc:   7e ce                   jle    804859c <compare_password+0x58>
 80485ce:   83 7d e4 08             cmpl   $0x8,-0x1c(%ebp)
 80485d2:   7e 07                   jle    80485db <compare_password+0x97>
 80485d4:   b8 01 00 00 00          mov    $0x1,%eax
 80485d9:   eb 05                   jmp    80485e0 <compare_password+0x9c>
 80485db:   b8 00 00 00 00          mov    $0x0,%eax
 80485e0:   8b 55 f4                mov    -0xc(%ebp),%edx
 80485e3:   65 33 15 14 00 00 00    xor    %gs:0x14,%edx
 80485ea:   74 05                   je     80485f1 <compare_password+0xad>
 80485ec:   e8 2f fe ff ff          call   8048420 <__stack_chk_fail@plt>
 80485f1:   c9                      leave  
 80485f2:   c3                      ret    

080485f3 <main>:
 80485f3:   55                      push   %ebp
 80485f4:   89 e5                   mov    %esp,%ebp
 80485f6:   83 e4 f0                and    $0xfffffff0,%esp
 80485f9:   83 ec 30                sub    $0x30,%esp
 80485fc:   65 a1 14 00 00 00       mov    %gs:0x14,%eax
 8048602:   89 44 24 2c             mov    %eax,0x2c(%esp)
 8048606:   31 c0                   xor    %eax,%eax
 8048608:   c7 44 24 04 00 00 00    movl   $0x0,0x4(%esp)
 804860f:   00 
 8048610:   8d 44 24 10             lea    0x10(%esp),%eax
 8048614:   89 04 24                mov    %eax,(%esp)
 8048617:   e8 f4 fd ff ff          call   8048410 <gettimeofday@plt>
 804861c:   8b 54 24 10             mov    0x10(%esp),%edx
 8048620:   8b 44 24 14             mov    0x14(%esp),%eax
 8048624:   0f af c2                imul   %edx,%eax
 8048627:   89 04 24                mov    %eax,(%esp)
 804862a:   e8 21 fe ff ff          call   8048450 <srand@plt>
 804862f:   e8 3c fe ff ff          call   8048470 <rand@plt>
 8048634:   89 44 24 18             mov    %eax,0x18(%esp)
 8048638:   8b 4c 24 18             mov    0x18(%esp),%ecx
 804863c:   ba 67 66 66 66          mov    $0x66666667,%edx
 8048641:   89 c8                   mov    %ecx,%eax
 8048643:   f7 ea                   imul   %edx
 8048645:   c1 fa 02                sar    $0x2,%edx
 8048648:   89 c8                   mov    %ecx,%eax
 804864a:   c1 f8 1f                sar    $0x1f,%eax
 804864d:   29 c2                   sub    %eax,%edx
 804864f:   89 d0                   mov    %edx,%eax
 8048651:   c1 e0 02                shl    $0x2,%eax
 8048654:   01 d0                   add    %edx,%eax
 8048656:   01 c0                   add    %eax,%eax
 8048658:   89 ca                   mov    %ecx,%edx
 804865a:   29 c2                   sub    %eax,%edx
 804865c:   89 d0                   mov    %edx,%eax
 804865e:   89 44 24 18             mov    %eax,0x18(%esp)
 8048662:   8b 54 24 18             mov    0x18(%esp),%edx
 8048666:   89 d0                   mov    %edx,%eax
 8048668:   c1 e0 02                shl    $0x2,%eax
 804866b:   01 d0                   add    %edx,%eax
 804866d:   01 c0                   add    %eax,%eax
 804866f:   8d 90 60 a0 04 08       lea    0x804a060(%eax),%edx
 8048675:   b8 c0 87 04 08          mov    $0x80487c0,%eax
 804867a:   89 54 24 04             mov    %edx,0x4(%esp)
 804867e:   89 04 24                mov    %eax,(%esp)
 8048681:   e8 7a fd ff ff          call   8048400 <printf@plt>
 8048686:   b8 da 87 04 08          mov    $0x80487da,%eax
 804868b:   8d 54 24 22             lea    0x22(%esp),%edx
 804868f:   89 54 24 04             mov    %edx,0x4(%esp)
 8048693:   89 04 24                mov    %eax,(%esp)
 8048696:   e8 e5 fd ff ff          call   8048480 <__isoc99_scanf@plt>
 804869b:   8d 44 24 22             lea    0x22(%esp),%eax
 804869f:   89 44 24 04             mov    %eax,0x4(%esp)
 80486a3:   8b 44 24 18             mov    0x18(%esp),%eax
 80486a7:   89 04 24                mov    %eax,(%esp)
 80486aa:   e8 95 fe ff ff          call   8048544 <compare_password>
 80486af:   89 44 24 1c             mov    %eax,0x1c(%esp)
 80486b3:   83 7c 24 1c 01          cmpl   $0x1,0x1c(%esp)
 80486b8:   75 0e                   jne    80486c8 <main+0xd5>
 80486ba:   c7 04 24 dd 87 04 08    movl   $0x80487dd,(%esp)
 80486c1:   e8 6a fd ff ff          call   8048430 <puts@plt>
 80486c6:   eb 0c                   jmp    80486d4 <main+0xe1>
 80486c8:   c7 04 24 f2 87 04 08    movl   $0x80487f2,(%esp)
 80486cf:   e8 5c fd ff ff          call   8048430 <puts@plt>
 80486d4:   8b 54 24 2c             mov    0x2c(%esp),%edx
 80486d8:   65 33 15 14 00 00 00    xor    %gs:0x14,%edx
 80486df:   74 05                   je     80486e6 <main+0xf3>
 80486e1:   e8 3a fd ff ff          call   8048420 <__stack_chk_fail@plt>
 80486e6:   c9                      leave  
 80486e7:   c3                      ret    
 80486e8:   90                      nop
 80486e9:   90                      nop
 80486ea:   90                      nop
 80486eb:   90                      nop
 80486ec:   90                      nop
 80486ed:   90                      nop
 80486ee:   90                      nop
 80486ef:   90                      nop
4

1 に答える 1

4

アセンブリ コードをゼロから学習するには、ある程度の時間と労力がかかりますが、基本を習得することに害はありません。

この出力の各行には、次の 3 つの部分が含まれています。

  1. そのコードが存在するファイル内のオフセット (16 進数)
  2. そのコードを構成するバイト (それぞれ 16 進数)
  3. そのコードのアセンブリ言語形式 (基本的にバイトから逆変換)。

プログラムの流れは、通常、最後の列から読み取ることができます。JMP のような命令は、コード内で近くにある場合とそうでない場合がある他の場所を参照します。それらは、次のようなラベル付きの形式で表示される場合があります。

jmp    804858d <compare_password+0x49>

つまり、 offset にジャンプすると0x804858d、最初の列でその値を見つけることができます。ラベルによると、これは の0x49後にオフセットされcompare_passwordます。

ほとんどの命令が何をするかわからない場合は、メモリとレジスタの個々のワードを移動、結合、比較することがほとんどです。各コードが何をするかを理解したとしても、この特定のプログラムのコンテキストでそれが何をするかを理解するのは難しい場合があります。また、通常、プログラムが実行されているときに、影響がどうなるかを知るために、他の重要なデータの場所を知る必要があります。

デバッグ、アセンブリ言語、逆アセンブルのレベルでコンピュータ プログラミングを学習するためのリソースはたくさんありますが、参考までに他の人に任せます。本当に学びたい場合は、C で独自の簡単なプログラムを作成し、それをアセンブリにコンパイルすることをお勧めします。次に、C とアセンブリの出力を並べて比較し、C ステートメントがどのように命令に変換されているかを調べます。

于 2012-11-12T03:42:18.677 に答える