0

参照用のコードは次のとおりです。

 8048e3c:       55                      push   %ebp 
 8048e3d:       89 e5                   mov    %esp,%ebp
 8048e3f:       83 ec 28                sub    $0x28,%esp
 8048e42:       8d 45 f8                lea    0xfffffff8(%ebp),%eax
 8048e45:       89 44 24 0c             mov    %eax,0xc(%esp) 
 8048e49:       8d 45 fc                lea    0xfffffffc(%ebp),%eax
 8048e4c:       89 44 24 08             mov    %eax,0x8(%esp)
 8048e50:       c7 44 24 04 22 a3 04    movl   $0x804a322,0x4(%esp)
 8048e57:       08 
 8048e58:       8b 45 08                mov    0x8(%ebp),%eax
 8048e5b:       89 04 24                mov    %eax,(%esp)
 8048e5e:       e8 ad fc ff ff          call   8048b10 <sscanf@plt>
 8048e63:       83 f8 01                cmp    $0x1,%eax
 8048e66:       7f 05                   jg     8048e6d <level_2+0x31>
 8048e68:       e8 13 11 00 00          call   8049f80 <explode_bomb>
 8048e6d:       8b 45 f8                mov    0xfffffff8(%ebp),%eax
 8048e70:       8b 55 fc                mov    0xfffffffc(%ebp),%edx
 8048e73:       01 d0                   add    %edx,%eax
 8048e75:       3d 56 24 00 00          cmp    $0x2456,%eax
 8048e7a:       74 07                   je     8048e83 <level_2+0x47>
 8048e7c:       e8 ff 10 00 00          call   8049f80 <explode_bomb>
 8048e81:       eb 29                   jmp    8048eac <level_2+0x70>
 8048e83:       8b 55 fc                mov    0xfffffffc(%ebp),%edx
 8048e86:       8b 45 f8                mov    0xfffffff8(%ebp),%eax
 **8048e89:       09 d0                   or     %edx,%eax
 8048e8b:       25 00 01 00 00          and    $0x100,%eax
 8048e90:       85 c0                   test   %eax,%eax
 8048e92:       75 07                   jne    8048e9b <level_2+0x5f>**
 8048e94:       e8 e7 10 00 00          call   8049f80 <explode_bomb>
 8048e99:       eb 11                   jmp    8048eac <level_2+0x70>
 8048e9b:       8b 45 fc                mov    0xfffffffc(%ebp),%eax
 8048e9e:       8b 55 f8                mov    0xfffffff8(%ebp),%edx
 8048ea1:       31 d0                   xor    %edx,%eax
 8048ea3:       85 c0                   test   %eax,%eax
 8048ea5:       7e 05                   jle    8048eac <level_2+0x70>
 8048ea7:       e8 d4 10 00 00          call   8049f80 <explode_bomb>
 8048eac:       c9                      leave  
 8048ead:       c3                      ret    

これに基づいて、このコードで機能する 2 つの整数の 3 つのルールを考え出しました。最後のものはよくわかりません: x+y = 9302: x|y != 256 & y: x^y <= 0 太字の行をどのように組み合わせるかは確かです。0x100 を 256 に変換し、コマンド jne が続いたため、!= を使用しました。私が確信していない部分は、 & または 256 への変換が必要な場合です。

4

1 に答える 1

1

強調表示した行は、次のように読むことができます。

eax |= edx;
if( (eax & 256) == 0 ) {
  explode_bomb();
}
于 2012-05-17T10:06:54.603 に答える